2013-01-09 88 views
6

我正在开发Java Servlets。在检查用户是否登录时,我想检查HTTP请求是否有有效的会话。为了检验这一点,我有2种可能:检查有效会话:isRequestedSessionIdValid()vs getSession(false)

(1)

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

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

因为我通过假作为参数,还有如果现有的已经没有有效的会话创建任何新的会话,并在函数返回null,因为我可以检查。

还是我做的:

(2)

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

有什么区别,什么优势/劣势?或者两个函数做的差不多呢?

回答

10

形式的Javadoc

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

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

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

+3

+1“在第一个请求容器创建会话并发送Jsessionid cookie和响应之后” – informatik01

1

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