我在哪里放置会话信息?在HttpServletRequest.setAttribute()中?

时间:2010-06-21 20:29:16

标签: jsp servlets

我有一个处理登录的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之间恢复它?

由于

1 个答案:

答案 0 :(得分:0)

会话绑定到特定域,默认情况下也绑定到上下文路径。如果OtherServlet在不同的域和/或上下文中运行,那么它将获得完全不同的会话。

如果您想在同一域上的不同Web应用程序上下文之间共享会话,则需要相应地配置servletcontainer以将cookie路径设置为 empty 。例如,如果是Tomcat,您可以通过在emptySessionPath文件中将HTTP Connectortrue属性设置为/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