2

我是 JSP 的新手,在我的 webapp 的特定页面上,我试图确定用户是否已登录。为此,我正在检查会话是否存在。如果会话不存在,那么我会将用户重定向到登录页面。

我对以下代码感到困惑

<%
if (null == session)
    out.println("session is null");
else
    out.println("session is not null");

if (null == request.getSession(false))
    out.println("request.getSession() is null");
else
    out.println("request.getSession() is not null");
%>

在任何情况下都会产生以下输出:

session is not null request.getSession() is not null 

我不明白为什么会话存在,即使我没有创建它。如何检查用户是否登录?

提前致谢。

4

5 回答 5

4

默认情况下,会话是由容器为您创建的。供 JSP 使用

<%@ page session="false" %>

在您的 JSP 上禁用会话创建。

为了检查用户是否存在,您需要在用户登录后在服务器端的会话中放置一些令牌/密钥。像

request.getSession().setAttribute("usertoken","authenticated");

在 JSP 上只需检查属性是否存在而不是 null

if ("authenticated".equals(session.getAttribute("usertoken")) {
   // do something
}
于 2012-07-07T10:26:04.773 回答
2

每当有用户浏览您的网站时,就会有一个会话。检查用户是否登录不应该取决于“会话存在”,因为它们是非常不同的概念。

您可以在用户登录时将会话属性存储在会话对象中,并在他/她注销时将其删除。但我建议配置“基于容器的身份验证”,这样您就不需要在会话中存储任何属性,并且可以使用请求方法“getUserPrincipal()”和“getRemoteUser()”来了解用户是否登录。此外,这种身份验证被证明更安全,并且符合 JavaEE 原则。

要获取有关如何设置容器管理身份验证的一些说明,您可以查看 SO: Performing user authentication in Java EE / JSF using j_security_check 中的另一个问题

于 2012-07-07T10:41:12.067 回答
0

您可以将用户设置为会话属性并检查其是否存在,而不是检查整个会话是否存在。

于 2012-07-07T10:29:46.810 回答
0

Web 容器为每个用户会话保存一个唯一的会话标识符。当用户在 Web 应用程序中请求另一个页面时,会话标识符与 HttpSession 对象一起返回给 servlet。

HttpSession getSession() - 如果它是有效的,总是返回一个与这个请求关联的 httpsession 对象,如果无效将创建一个新的会话对象。

HttpSession getSession(boolean create) - 如果它有效则返回与此请求关联的 httpsession 对象,但如果无效则仅当“create”输入为“true”时才创建新的会话对象。

于 2012-07-07T11:11:54.237 回答
0

我想在@jdevelop 的回答上再补充一点:

一旦您<%@ page session="false" %>在 JSP 页面中写入,session对象将直接变为不可用。这就是为什么您必须使用request.getSession(false)(当然您必须添加null检查)来访问会话对象的原因。

于 2017-11-13T09:49:59.650 回答