6

我正在开发 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
        ...
    }

有什么区别,有什么优点/缺点吗?或者这两个功能或多或少是一样的?

4

2 回答 2

10

表单 Javadoc

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

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

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

于 2013-01-09T18:06:40.720 回答
1

Based on the wording of the JavaDoc, it seems like there would be a distinction: if a valid session has already been created (from a prior call to request.getSession(true)), then the requested session ID will not be valid, but request.getSession(false) will have a valid (non-null) session to return. I haven't tested this theory.

于 2013-09-25T20:08:54.013 回答