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

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

我们正在使用Spring mvc的@Sessionattributes来在会话范围内存储数据。

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

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

问题:例如,用户给出了一些输入和搜索,并将结果存储在名称为“searchresults”的会话中。

如果用户打开新标签页并使用不同标准搜索,则搜索结果将存储在名为“searchresults”的会话中。

因此,如果用户重新加载第一个标签......他会在第二个标签中搜索结果。

所以..:搜索结果会话将从第二个标签结果...所以即使用户刷新第一个标签..他会看到他使用第二个标签的结果..

有没有这个春天mvc的解决方案...


Yeps,正如lewthor所说,多个标签共享一个会话。

处理这种情况的一种方法是在会话密钥中包含一个制表符特定的url组件。 如果您在产品列表页面上,并且您打开每个产品的新选项卡,但是如果确保选项卡打开时的url不同,例如通过使用url /product/{product.id}中的产品ID,则所有您必须确保正确的行为将会话ID附加到会话密钥searchresults{product.id}

还有一个以@SessionAttribute为中心的解决方案,这是一个为此目的服务的定制,在这里的博客中描述并基于这里描述的旧博客。 该解决方案实现了一个CustomSessionAttributeStore,并且维护了一个映射Map,其中的内部映射是deafult 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上


发生这种情况是因为浏览器将单独的选项卡视为同一会话。 您可以通过使用浏览器的开发工具来检查从两个不同选项卡发送的会话cookie--它们将是相同的。

因此,Spring将来自不同选项卡的所有请求都视为同一个会话。 如果您希望用户能够在不同的选项卡中进行单独搜索,则必须以会话属性以外的某种方式管理搜索结果。

链接地址: http://www.djcxy.com/p/58689.html

上一篇: Spring MVC @Sessionattributes issue in multiple browser tabs

下一篇: MyFaces: all pages throw duplicate id error after enabled partial state saving