我有一个处理登录的servlet类。在我的登录程序结束时,我这样做:
// jsp page
...
Helper.loginUser(request);
// Helper.java
public static void loginUser(HttpServletRequest request) {
request.getSession().setAttribute("username", "john");
}
为了记住用户在页面加载之间的用户。在另一个servlet(处理ajax调用)中,我需要查看该会话是否对用户有效。看起来像这样:
// OtherServlet.java
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
String username = (String)req.getSession().getAttribute("username");
}
但是获取属性始终返回null。我应该在哪里存储会话信息,以便我可以在不同的servlet之间恢复它?
由于
答案 0 :(得分:0)
会话绑定到特定域,默认情况下也绑定到上下文路径。如果OtherServlet
在不同的域和/或上下文中运行,那么它将获得完全不同的会话。
如果您想在同一域上的不同Web应用程序上下文之间共享会话,则需要相应地配置servletcontainer以将cookie路径设置为 empty 。例如,如果是Tomcat,您可以通过在emptySessionPath
文件中将HTTP Connector的true
属性设置为/conf/server.xml
来实现此目的。
更新,在重新检查您的问题后,JSP中的Helper.loginUser(request)
方法不是一个好习惯。你应该在Servlet类中这样做。顺便说一下,这可能也是servletcontainer无法设置会话cookie的原因,因为已经发送了响应头,但是您应该已经注意到服务器日志中有一个自解释的IllegalStateException
。
为了进一步帮助您,以下是登录用户的正确方法的基本启动示例:
JSP中的HTML表单:
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
在doPost()
的{{1}}上映射的Servlet的 url-pattern
方法:
/login