gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:36:52 25 4
gpt4 key购买 nike

我们正在使用最新版本的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com