2014-11-05 73 views
0

我们使用的是最新版本的spring。 。在多个浏览器选项卡中弹出MVC @Sessionattributes问题

我们UDING Spring MVC中的@SessionAttributes到stote数据会话范围..

的问题是,当我们用浏览器的多个选项卡按预期工作它不能正常工作。 。

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

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

如果用户打开新的标签页,并使用不同的标准再次搜索结果的搜索将被储存在名为“SearchResult所”会话..

所以,如果用户重新加载第一个选项卡......他会SE搜索结果无论在第二个标签..

所以..:searchresults“会话将有第二个选项卡的结果...所以即使用户刷新第一个tab ..他会看到他使用第二个选项卡的结果..

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

回答

1

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

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

2

Yeps,因为lewthor表示多个选项卡共享一个会话。

处理这种情况的一种方法是在会话密钥中包含制表符特定的url组件。如果您使用的是产品详情页面,并且您打算为每个产品打开一个新标签,但如果您确保标签页打开时的网址不同,例如通过在URL中使用/product/{product.id}产品ID,所有你需要做的做正确的行为是id追加到会话密钥searchresults{product.id}

还有一个@SessionAttribute中心的解决方案,用作眼前这个目的的定制,在descibed blog这里和基于旧的博客描述here。该解决方案实现了CustomSessionAttributeStore和maintaines一个Map地图,其中内部地图是deafult SessionAttributes,由对话id标识(在你的情况下,标签ID)整个项目发布在GitHub

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); 
    } 
} 

+0

对钱的权利。谢谢(你的)信息。 – 2015-01-29 16:12:24

相关问题