我有一个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中使用的持久属性?
答案 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操作。