在 Java 中管理会话的最佳方法。我听说 cookie 不是可靠的选择,因为它们会存储到浏览器中并可以稍后访问?它是否正确?如果可能,请通过编码示例给出答案。
其中最好的是:
-
网址重写:服务器会在URL链接末尾添加一个附加参数
-
表单中的隐藏参数:服务器将在 HTML 中的每个表单中添加一个附加参数
-
cookie:服务器会要求浏览器维护一个cookie。
会话管理(客户端识别、cookie 处理、保存会话范围数据等)基本上已经由应用程序服务器本身完成。你根本不需要担心它。您可以通过以下方式在会话中设置/获取 Java 对象HttpSession#setAttribute() and #getAttribute()。你真正需要关心的唯一一件事是网址重写对于客户端不支持cookie的情况。然后它会附加一个jsessionid
URL 的标识符。在 JSP 中您可以使用 JSTLc:url为了这。在Servlet中你可以使用HttpServletResponse#encodeURL()为了这。这样服务器就可以通过读取新的请求URL来识别客户端。
您的新问题可能是“但是 cookie 与此有何关系?服务器如何完成这一切?”。好吧,答案是这样的:如果服务器收到来自客户端的请求,并且服务器端代码(您的代码)正在尝试获取HttpSession by HttpServletRequest#getSession()虽然还没有创建一个(新会话中的第一个请求),但服务器将自行创建一个新的。服务器将生成一个长的、唯一的且难以猜测的 ID(您可以通过HttpSession#getId()) 并将此 ID 设置为名称为 cookie 的值jsessionid
。服务器使用的引擎盖下HttpServletResponse#addCookie()为了这。最后,服务器将以某种形式存储所有会话Map
以会话 ID 作为密钥,HttpSession
作为价值。
根据HTTP cookie 规范客户端需要在后续请求的标头中发送回相同的 cookie。在引擎盖下,服务器将搜索jsessionid
饼干由HttpServletRequest#getCookies()并确定其价值。这样服务器就可以获取到相关的HttpSession
并在每次致电时归还HttpServletRequest#getSession()
.
重点是:客户端存储的唯一内容是会话 ID(类似于 cookie)和HttpSession
对象(包括其所有属性)存储在服务器端(Java 内存中)。您不需要自己担心会话管理,也不需要担心安全性。
也可以看看:
- 使用Java中的过滤器验证用户名、密码(与数据库联系)
- 当Java Web应用程序中的Session过期时如何重定向到登录页面?
- 当用户登录Web应用程序时如何实现“保持登录”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)