【问题标题】:Check for valid session: isRequestedSessionIdValid() vs getSession(false)检查有效会话:isRequestedSessionIdValid() vs getSession(false)
【发布时间】:2013-01-09 17:55:42
【问题描述】:

我正在开发 Java Servlet。在检查用户是否登录时,我想检查 HTTP 请求是否具有有效会话。为了检查这一点,我有两种可能性:

(1)

protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {

    HttpSession session = request.getSession(false);
    if (session != null) {
        // user is logged in
        ...
    }
}

由于我将 false 作为参数传递,如果不存在有效会话,则不会创建新会话,并且函数返回 null,我可以检查。

或者我愿意:

(2)

    if (request.isRequestedSessionIdValid()) {
        // user is logged in
        ...
    }

有什么区别,有什么优势/劣势吗?还是这两个函数的作用大致相同?

【问题讨论】:

    标签: java servlets httprequest


    【解决方案1】:

    形成 Javadoc

    isRequestedSessionIdValid 布尔 isRequestedSessionIdValid() 检查请求的会话 ID 是否仍然有效。 如果客户端未指定任何会话 ID,则此方法返回 false。

    返回: 如果此请求在当前会话上下文中具有有效会话的 ID,则为 true;否则为假

    所以在某种意义上两者都是一样的。但是您需要注意的是 request.getSession(false) 只有在第一次请求容器的情况下才会为空。在第一个请求容器创建会话并发送 Jsessionid cookie 和 response 之后,它可以跟踪来自同一浏览器的后续请求。所以在你的情况下,而不是检查会话是否为空,你应该存储一个会话属性“is_logged_in”=true,如果会话不为空,也要检查这个属性。

    【讨论】:

    • +1 表示“在第一个请求容器创建会话并发送 Jsessionid cookie 和响应之后”
    【解决方案2】:

    根据 JavaDoc 的措辞,似乎会有一个区别:如果已经创建了一个有效会话(从之前对 request.getSession(true) 的调用),那么请求的会话 ID 将无效,但是request.getSession(false) 将返回一个有效(非空)会话。我没有测试过这个理论。

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多