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

Java 检查有效会话:isRequestedSessionIdValid()vs getSession(false),java,servlets,httprequest,Java,Servlets,Httprequest,我正在开发Java servlet。在检查用户是否登录时,我想检查HTTP请求是否具有有效会话。为了检查这一点,我有两种可能性: (一) 由于我将false作为参数传递,因此如果没有有效的会话存在,则不会创建新会话,并且函数返回null,这是我可以检查的 或者我会: (二) 有什么区别,有什么优点/缺点吗?或者这两个函数做的差不多吗?表单Javadoc isRequestedSessionIdValid 布尔值isRequestedSessionIdValid() 检查请求的会话ID是否仍然有效

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

(一)

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

或者我会:

(二)

有什么区别,有什么优点/缺点吗?或者这两个函数做的差不多吗?

表单Javadoc

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

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


所以在某种意义上,两者都是相同的。但是您需要注意的是request.getSession(false)只有在第一次请求容器时才会为null。在第一个请求之后,容器创建会话并发送Jsessionid cookie和响应,以便它可以跟踪来自同一浏览器的后续请求。因此,在您的情况下,您不应该检查会话是否为null,而应该存储一个会话属性“is_logged_in”=true,并检查会话是否为null。根据JavaDoc的措辞,似乎有一个区别:如果已经创建了有效的会话(从先前对
request.getSession(true)
)的调用来看,请求的会话ID将无效,但是
request.getSession(false)
将返回一个有效(非空)会话。我还没有测试过这个理论。

+1表示“在第一个请求容器创建会话并发送JSSessionID cookie以及响应之后”
protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {

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