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

问题描述 投票:0回答:3

我正在开发 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
3个回答
12
投票

形成 Javadoc

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

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

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


1
投票

根据 JavaDoc 的措辞,似乎存在区别:如果已经创建了有效会话(从之前的调用

request.getSession(true)
),那么请求的会话 ID 将无效,但是
request.getSession(false) 
将返回一个有效(非空)会话。我还没有测试过这个理论。


0
投票

要检测以前的过期会话,请使用:

request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()

© www.soinside.com 2019 - 2024. All rights reserved.