检查有效会话:isRequestedSessionIdValid()vs getSession(false)

时间:2013-01-09 17:55:42

标签: java servlets httprequest

我正在开发Java Servlets。在检查用户是否已登录时,我想检查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
        ...
    }

有什么区别,有什么优势/劣势吗?或者这两个功能或多或少都相同?

2 个答案:

答案 0 :(得分:10)

表格Javadoc

  

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

     

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

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

答案 1 :(得分:1)

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