java - Spring MVC @Sessionattributes 在多个浏览器选项卡中出现问题

标签 java spring-mvc session-management

我们正在使用最新版本的 spring。 .

我们正在使用 spring mvc 的 @Sessionattributes 在 session 范围内存储数据..

问题是当我们使用浏览器的多个选项卡时,它无法按预期工作。 .

我们有一个搜索页面,允许用户使用多个字段搜索数据库。我们使用 @Sessionattributes 将结果存储在 session 中。

问题: 例如,用户提供一些输入和搜索,结果存储在名为“searchresults”的 session 中。

如果用户打开新选项卡并再次使用不同条件进行搜索,搜索结果将存储在名为“searchresults”的 session 中。

因此,如果用户重新加载第一个选项卡...他将看到第二个选项卡中的搜索结果...

所以..: session 中的searchresults”将包含第二个选项卡的结果...所以即使用户刷新第一个选项卡..他也会看到使用第二个选项卡获得的结果..

这个spring mvc有什么解决办法吗...

最佳答案

是的,如 lewthor说多个选项卡共享一个 session 。

处理这种情况的一种方法是使用一个选项卡特定的 url 组件,该组件将包含在 session key 中。如果您在产品列表页面上,并且要为每个产品打开一个新选项卡,并且确保打开选项卡时的 URL 不同,例如通过在网址 /product/{product.id} 中使用产品 id,您所要做的就是将 id 附加到 session key searchresults{product.id}

还有一个以 @SessionAttribute 为中心的解决方案,这是一种专门用于此目的的定制,如 blog 中所述。此处并基于旧博客描述的 here 。该解决方案实现了 CustomSessionAttributeStore,并维护一个 Map of Maps,其中内部 Map 是默认的 SessionAttributes,由对话 id(在您的情况下为选项卡 id)标识

public class ConversationalSessionAttributeStore implements SessionAttributeStore, InitializingBean {

  @Inject
  private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
  private Logger logger = Logger.getLogger(ConversationalSessionAttributeStore.class.getName());

  private int keepAliveConversations = 10;

  public final static String CID_FIELD = "_cid";
  public final static String SESSION_MAP = "sessionConversationMap";

  @Override
  public void storeAttribute(WebRequest request, String attributeName, Object attributeValue) {
    Assert.notNull(request, "WebRequest must not be null");
    Assert.notNull(attributeName, "Attribute name must not be null");
    Assert.notNull(attributeValue, "Attribute value must not be null");

    String cId = getConversationId(request);
    if (cId == null || cId.trim().length() == 0) {
      cId = UUID.randomUUID().toString();
      request.setAttribute(CID_FIELD, cId, WebRequest.SCOPE_REQUEST);
    }

    logger.debug("storeAttribute - storing bean reference for (" + attributeName + ").");
    store(request, attributeName, attributeValue, cId);
  }

  private String getConversationId(WebRequest request) {
    return request.getParameter(CID_FIELD);
  }
}

整个项目发布在 GitHub

关于java - Spring MVC @Sessionattributes 在多个浏览器选项卡中出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757128/

相关文章:

spring - 如何使用 Spring Security 通知用户另一个 session ?

java - Servlet,从html文件获取参数和doGET doPOST

java - 来自字符串的位图

java - 了解 synchronized 关键字的工作原理

java - 将 Spring Boot war 文件部署到 Tomcat 结果为 404,本地主机工作正常

java - 如何在 Thymeleaf 3.0.5 中从 DB 读取 Thymeleaf 模板?

java - super 调用 javax.xml.ws.Service 期间出现“找不到符号”错误

java - Spring Boot资源静态文件夹

asp.net-mvc-3 - 使用表单例份验证在 ASP.NET MVC3 中注销用户的其他 session

java - 应用从单体服务升级到微服务