【问题标题】:Session management using HTTPSession使用 HTTPSession 进行会话管理
【发布时间】:2014-04-22 03:16:08
【问题描述】:

我正在尝试使用 HTTPSession 了解 JSP/Servlets 中的会话管理,但在任何 Web 应用程序中进行可视化时感到困惑。所以需要澄清一下。假设我有一个使用 JSP/Servlets 的 Web 应用程序。有一个登录页面。当用户第一次点击登录页面时,通过 web.xml 和应用程序服务器,请求到达适当的 servlet。在那个 servlet 中,我们得到 session 对象和 sessionId,同时 JSESSIONID 的值也是设置,提供的 cookie 未被禁用。验证登录凭据后,用户被重定向到主页。 我的第一个疑问是当用户被重定向到主页时,我们是否必须显式验证会话或隐式客户端将使用存储的 JSESSIONID 进行验证。 现在如果用户单击主页中的某个链接并到达第二页,我们是否需要在服务器端和客户端显式比较旧存储的 sessionID。如果是,那么我们需要将该 sessionId 和相应的 userId 存储在某种静态中哈希图。这种方法正确吗? 请澄清我是否理解错误。

【问题讨论】:

    标签: jsp session servlets httpsession


    【解决方案1】:

    您实际上不必弄乱会话 ID 本身,除非您可能正在使用负载平衡并且可能需要这样做。但是,如果您只使用一台服务器,则无需自己对它进行任何操作。会话 id 告诉您的 servlet 容器,比如说 Tomcat,从哪里获取该用户的会话。因此,当您调用session.getAttribute("username")session.setAttribute("username", userid) 或类似名称时,它会通过会话ID 知道从哪个会话中提取或保存它。但是您只需要处理存储在会话中的属性。

    为了防止会话交叉,您可以将用户的 IP 和用户代理存储在会话中,并在每个页面中将 IP 和用户代理请求中的值与会话中的值进行比较,如果它们不匹配,使会话无效(即session.invalidate())并重定向到登录页面(即response.sendRedirect("loginform.jsp"); return;),因为这可能意味着有人截获了其他人的会话cookie。

    如果您要求用户登录,则在每个页面上,您都需要检查包含用户名的会话属性是否不为空,如果是则重定向到登录页面。

    【讨论】:

    • 感谢您的精彩解释。请确认我是否理解正确。假设多个用户已登录系统。应用程序服务器足够智能,可以为每个用户维护单独的会话 ID,我们必须明确地通过在某些会话属性中存储 ip 地址和用户 ID 来防止会话交叉。
    猜你喜欢
    • 2013-12-18
    • 2016-02-07
    • 2012-12-15
    • 2016-04-26
    • 2014-09-21
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多