java - Java session 管理的最佳选择

标签 java session servlets cookies url-rewriting

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 是如何与此相关的?服务器是如何完成这一切的?”。好吧,答案是这样的:如果服务器收到来自客户端的请求并且服务器端代码(您的代码)试图获取 HttpSessionHttpServletRequest#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/

相关文章:

java - 是否可以让 JAX-RS 服务处理同一 URI 上的 GET 并让 WebServlet 处理 POST?

java - 500 内部服务器错误,获取请求时出现 NullPointerException

java - 选择 : Migrating from Classic ASP to . NET 或迁移到开源平台

java - JavaFX 中的饼图,设置自定义颜色会导致 Node 实例为空指针

python - 如何获取我的模型所附加的 session ID?

session - BDE inmem000.rem 访问/共享冲突

php - 未定义的属性:CI::$session

java - Spring Boot Controller 导出 Excel

java - Firefox 浏览器/服务器协商的选定密码与 Tomcat 配置的密码列表不匹配

java - Java 9 也适用于 WAR 文件吗?