我正在开发 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
...
}
有什么区别、优点/缺点吗?或者这两个函数的作用或多或少相同?
形成 Javadoc
isRequestedSessionIdValid 布尔 isRequestedSessionIdValid() 检查请求的会话 ID 是否仍然有效。 如果客户端没有指定任何会话 ID,该方法返回 false。
退货: 如果此请求具有当前会话上下文中有效会话的 ID,则为 true;否则为假
所以从某种意义上来说两者是相同的。但您需要注意的是,仅在第一次请求容器时 request.getSession(false) 才会为 null。在第一个请求容器创建会话并发送 Jsessionid cookie 和响应之后,以便它可以跟踪来自同一浏览器的后续请求。因此,在您的情况下,您应该存储会话属性“is_logged_in”=true,而不是检查会话是否为空,并在会话不为空时检查此属性。
根据 JavaDoc 的措辞,似乎存在区别:如果已经创建了有效会话(从之前的调用
request.getSession(true)
),那么请求的会话 ID 将无效,但是request.getSession(false)
将返回一个有效(非空)会话。我还没有测试过这个理论。
要检测以前的过期会话,请使用:
request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()
。