如何将session.attribute从jsp保存到servlet



我有一个登录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);
%>

最新更新