我想使用Java Servlets构建无状态Web应用程序。因为它是无状态的,所以没有HttpSession。浏览器中有一个会话,但每个请求可能由群集中的其他节点处理。存储在浏览器中的会话标识符由服务器生成并加密,因此很难有人制作有效的假会话ID并绕过登录。
最近我在此架构中发现了一个漏洞:如果恶意(受感染)浏览器将会话标识符发送给强盗,则会话很容易被劫持。我无法在每个请求中重新生成会话标识符,因为服务器上没有会话来跟踪预期的请求序列,这也会使异步请求的处理变得复杂。
到目前为止,我的解决方案是获取一些HTTPS会话标识符并将其包含在存储在浏览器中的加密会话ID中。标准servlet可以从HTTPS连接获取此类信息吗?
另一种选择是仅为getId()使用HttpSession,但只有当这样的ID与HTTPS会话绑定时才会起作用,这是我在servlet规范中找不到的。
欢迎提出其他建议。
答案 0 :(得分:6)
servlet容器在HttpServletRequest属性中填充SSL会话ID,供下游组件使用。属性名称恰好是javax.servlet.request.ssl_session_id
。据我所知,这在实现Servlet规范3.0的所有容器中都可用。在Servlet Spec 3.0之前,如果我没有弄错的话,可以使用有限的容器 - Tomcat和Jetty。
但请注意,SSL会话ID被认为比容器生成的HTTP会话cookie值更安全。泄露SSL会话ID甚至会使您的HTTPS连接不安全。