我有一个登录Servlet,我在其中设置了用户登录的属性:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
... OMITTED
request.getSession().setAttribute("user", user_name);
request.getRequestDispatcher("index.jsp").forward(request, response);
... OMITTED
}
从index.jsp转到我的quit.jsp,直到这里我可以访问通过getAttribute()
登录的用户。但在我的quit.jsp中,我只要求登录的用户输入密码,然后调用quit Servlet。问题是,在Quit Servlet中,当我尝试访问使用getAttribute()
登录的当前用户时,属性"user"为null所以我的问题是:如何使用在servlet中创建的持久属性,该属性将在jsp和servlet中使用
您的问题可能不那么容易解决。我也遇到过类似的情况,所以我可以给你一些调查建议:
空数据的原因是,当您的会话(存储属性的地方(因同一用户发出新的登录POST而终止、超时、重新创建时,您的自定义会话数据就会随之终止,除非您将其作为session_id存储在持久存储中,如用户浏览器上的Cookie或每个用户的数据库中:但这可能很难实现。
作为捷径:
在HttpServlet中查看此方法文档:getThreadLocalRequest((.getSession(false(;
这也可能解决你的问题:
request.getSession((.setMaxInactiveInterval(3600(;//使会话无效之前调用之间的最大间隔(秒(。这意味着一个小时后,您将需要自动注销您的用户(或强制他重新登录(,以防止遇到null。
注销将调用:
session.removeAttribute("attribute"(;session.invalidate((;
还要注意,您提到有两个不同的servlet(在Tomcatweb.xml??中定义(。一个是Login,另一个是Quit,它们都响应POST/GET。我想它们有两个不同的实现,我认为它们不共享同一个会话对象。因此,在这种情况下,您可能必须在同一个servlet中实现Login+Quit操作,并具有适当的会话无效时间间隔。
在JSP
文件中,默认情况下,HttpServletRequest
可用,变量名为request
。您也可以在JSP
文件中以相同的方式使用它。
所以
request.getSession().setAttribute("user", user_name);
也将在JSP文件中提供。
<%
request.getSession().setAttribute("user", user_name);
%>