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

时间:2018-11-20 13:50:47

标签: java jsp servlets

我有一个Login Servlet,我在其中设置了用户登录的属性:

MoveObjects

从index.jsp转到quit.jsp,直到这里我可以访问通过private IEnumerator BuildStairs(MoveObjects moveObjects) { ... moveObjects.objectsToMove.add (stair); ... } 登录的用户。但是,在我的quit.jsp中,我要求用户仅登录以输入密码,然后调用Quit 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 } 登录的当前用户时,在退出Servlet中,属性“ user”为null。 所以我的问题是:如何使用在servlet中创建的将在jsp和servlet中使用的持久属性?

2 个答案:

答案 0 :(得分:0)

JSP文件中,默认情况下HttpServletRequest的变量名称为request。您也可以在JSP文件中以相同方式使用它。

所以

request.getSession().setAttribute("user", user_name);

在JSP文件中也将可用。

<%
request.getSession().setAttribute("user", user_name);
%>

答案 1 :(得分:0)

您的问题可能不是那么容易解决。我遇到过类似的情况,所以我可以给你一些调查提示:

空数据的原因是,当会话(存储属性的位置)死亡时,超时会重新创建,因为同一用户发出新的Login POST,然后自定义会话数据会随之死亡,除非您将其作为session_id引用存储在诸如用户浏览器中的Cookie或每个用户的数据库之类的持久性存储中:但这实现起来可能非常复杂。

快捷方式:

在HttpServlet中查看此方法文档:getThreadLocalRequest()。getSession(false);

这也可以解决您的问题:

request.getSession()。setMaxInactiveInterval(3600); //无效会话之前的两次呼叫之间的最大间隔(以秒为单位)。这意味着一小时后,您将需要自动注销您的用户(或强迫他重新登录),以防止遇到空值。

注销将呼叫:

session.removeAttribute(“ attribute”); session.invalidate();

还要注意,您提到有2个不同的servlet(在Tomcat web.xml中定义)。一个是登录,另一个是退出,它们都响应POST / GET。我想  它们有两个不同的实现,我认为它们不共享相同的会话对象。因此,在这种情况下,您可能必须在具有适当会话无效时间间隔的同一servlet中实施Login + Quit操作。