【问题标题】:Java: Session attribute is only in next operationJava:会话属性仅在下一个操作中
【发布时间】:2011-05-26 18:21:17
【问题描述】:

我在通话中发布了一些字符串

request.getSession().setAttribute(key, value);

并使用

进行重定向
response.sendRedirect(urlRedirect);

在几乎所有情况下,重定向后值都在那里。

但有时我只能在下一页视图中读取此值,而不是在重定向中。没有共同的行为。

有人遇到过同样的问题吗?

【问题讨论】:

    标签: java session jsp servlets


    【解决方案1】:

    会话由 HTTP cookie 支持。在首次创建会话时,将在响应标头中设置一个 cookie。默认情况下,cookie 仅绑定到特定的上下文。

    因此,如果您在 cookie 尚未设置时重定向,会话将会丢失。要解决这个问题,您需要对重定向 URL 进行编码。

    response.sendRedirect(response.encodeRedirectURL(url));
    

    这会将jsessionid 标识符附加到 URL 中,这允许 servletcontainer 在没有 cookie 帮助的情况下定位正确的会话。

    如果您不喜欢 jsessionid 的东西,那么请考虑实施像 this 这样的过滤器,以确保客户端在请求进入您触发重定向的控制器之前知道会话 cookie。

    此外,如果您重定向到不同的上下文,它将无法访问同一个会话。要解决这个问题,您需要配置 servletcontainer 在上下文之间共享会话。例如在 Tomcat 中,检查/conf/server.xml<Connector> elementemptySessionPath 属性。

    【讨论】:

    • 解决方法 response.sendRedirect(response.encodeRedirectURL(url));不工作:(
    • 你能验证它之前和之后是否是相同会话吗?通过打印/记录 session.getId()${pageContext.session.id} 进行调试。
    • @BalusC 会话是一样的,我用 session.getId() 检查
    • @Victor 尝试更换容器 & / |浏览器只是为了确保
    • 这个错误在 Firefox 上从来没有出现过,只有在 IE7 上。而且我无法更改容器...
    【解决方案2】:

    这种行为可能是由缓存引起的。

    如果您要重定向到的页面是从浏览器缓存中检索到的,那么您显然无法在其上看到setAttribute() 的结果。因此,请确保它确实是浏览器请求的。

    【讨论】:

    • 不,我已禁用此页面的缓存。 :)
    • 然而,他说得有道理。如果确实没有从缓存中请求,您可以在 Firefox 中使用 Firebug Net 面板进行验证。对于正确的缓存头,检查this answer
    【解决方案3】:

    您确定需要通过浏览器 (response.sendRedirect()) 而不是在服务器端 (RequestDispatcher.forward()) 进行重定向吗?后者更快,因为没有网络往返。

    【讨论】:

      【解决方案4】:

      通过更改提交方式解决了问题。

      页面提交数据只是将 location.href 的值更改为 Servlet 操作。

      我们只从页面表单调用提交函数,会话属性工作正常!

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多