Java 中管理 session 的最佳方式。我听说 cookie 不是可靠的选择,因为它们存储在浏览器中,以后可以访问?这个对吗?如果可能,请通过编码示例给出答案。
哪个是最好的:
- URL重写:服务器会在URL链接的末尾添加一个额外的参数
- 表单中的隐藏参数:服务器将在 HTML 中的每个表单中添加一个附加参数
- cookie:服务器会要求浏览器维护一个cookie。
最佳答案
session 管理(客户端识别、cookie 处理、保存 session 范围数据等)基本上已经由应用服务器本身完成。你根本不需要担心它。您可以通过 HttpSession#setAttribute()
在 session 中设置/获取 Java 对象。和 #getAttribute()
.只有当客户端不支持 cookie 时,您真正需要注意的是 URL 重写。然后它会将 jsessionid
标识符附加到 URL。在 JSP 中,您可以使用 JSTL 的 c:url
为了这。在 Servlet 中可以使用 HttpServletResponse#encodeURL()
为了这。这样服务器就可以通过读取新的请求 URL 来识别客户端。
您的新问题可能是“但是 cookie 是如何与此相关的?服务器是如何完成这一切的?”。好吧,答案是这样的:如果服务器收到来自客户端的请求并且服务器端代码(您的代码)试图获取 HttpSession
由 HttpServletRequest#getSession()
虽然还没有创建一个(新 session 中的第一个请求),但服务器将自己创建一个新的。服务器将生成一个长的、唯一且难以猜测的 ID(您可以通过 HttpSession#getId()
获得的 ID)并将此 ID 设置为名称为 jsessionid
的 cookie 的值。服务器在后台使用 HttpServletResponse#addCookie()
为了这。最后,服务器会将所有 session 存储在某种 Map
中, session ID 为键,HttpSession
为值。
根据HTTP cookie spec客户端需要在后续请求的 header 中发回相同的 cookie。在后台,服务器将通过 HttpServletRequest#getCookies()
搜索 jsessionid
cookie并确定其值(value)。这样,服务器就能够获取关联的 HttpSession
并通过每次调用 HttpServletRequest#getSession()
将其返回。
直截了当:唯一存储在客户端的是 session ID(类似于 cookie)和 HttpSession
对象(包括其所有属性)存储在服务器端(在 Java 的内存中)。您自己无需担心 session 管理,也无需担心安全性。
另见:
关于java - Java session 管理的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700390/