【发布时间】:2011-05-26 18:21:17
【问题描述】:
我在通话中发布了一些字符串
request.getSession().setAttribute(key, value);
并使用
进行重定向response.sendRedirect(urlRedirect);
在几乎所有情况下,重定向后值都在那里。
但有时我只能在下一页视图中读取此值,而不是在重定向中。没有共同的行为。
有人遇到过同样的问题吗?
【问题讨论】:
我在通话中发布了一些字符串
request.getSession().setAttribute(key, value);
并使用
进行重定向response.sendRedirect(urlRedirect);
在几乎所有情况下,重定向后值都在那里。
但有时我只能在下一页视图中读取此值,而不是在重定向中。没有共同的行为。
有人遇到过同样的问题吗?
【问题讨论】:
会话由 HTTP cookie 支持。在首次创建会话时,将在响应标头中设置一个 cookie。默认情况下,cookie 仅绑定到特定的上下文。
因此,如果您在 cookie 尚未设置时重定向,会话将会丢失。要解决这个问题,您需要对重定向 URL 进行编码。
response.sendRedirect(response.encodeRedirectURL(url));
这会将jsessionid 标识符附加到 URL 中,这允许 servletcontainer 在没有 cookie 帮助的情况下定位正确的会话。
如果您不喜欢 jsessionid 的东西,那么请考虑实施像 this 这样的过滤器,以确保客户端在请求进入您触发重定向的控制器之前知道会话 cookie。
此外,如果您重定向到不同的上下文,它将无法访问同一个会话。要解决这个问题,您需要配置 servletcontainer 在上下文之间共享会话。例如在 Tomcat 中,检查/conf/server.xml 中<Connector> element 的emptySessionPath 属性。
【讨论】:
session.getId() 或 ${pageContext.session.id} 进行调试。
这种行为可能是由缓存引起的。
如果您要重定向到的页面是从浏览器缓存中检索到的,那么您显然无法在其上看到setAttribute() 的结果。因此,请确保它确实是浏览器请求的。
【讨论】:
您确定需要通过浏览器 (response.sendRedirect()) 而不是在服务器端 (RequestDispatcher.forward()) 进行重定向吗?后者更快,因为没有网络往返。
【讨论】:
通过更改提交方式解决了问题。
页面提交数据只是将 location.href 的值更改为 Servlet 操作。
我们只从页面表单调用提交函数,会话属性工作正常!
【讨论】: