Java Spring MVC@Sessionattributes在多个浏览器选项卡中发布
我们正在使用最新版本的spring 我们正在使用spring mvc的@Sessionattributes在会话范围内存储数据 问题是,当我们使用浏览器的多个选项卡时,它无法按预期工作 我们有一个搜索页面,允许用户使用多个字段搜索数据库。我们使用@Sessionattributes将结果存储在会话中 问题: 例如,用户提供一些输入和搜索,结果存储在名为“searchresults”的会话中 如果用户打开新选项卡并再次使用不同的条件进行搜索,搜索结果将存储在名为“searchresults”的会话中 所以,如果用户重新加载第一个选项卡,他将搜索第二个选项卡中的任何内容 因此,会话中的..:searchresults“将有来自第二个选项卡的结果…因此,即使用户刷新第一个选项卡..他也将看到使用第二个选项卡得到的结果Java Spring MVC@Sessionattributes在多个浏览器选项卡中发布,java,spring-mvc,session-management,Java,Spring Mvc,Session Management,我们正在使用最新版本的spring 我们正在使用spring mvc的@Sessionattributes在会话范围内存储数据 问题是,当我们使用浏览器的多个选项卡时,它无法按预期工作 我们有一个搜索页面,允许用户使用多个字段搜索数据库。我们使用@Sessionattributes将结果存储在会话中 问题: 例如,用户提供一些输入和搜索,结果存储在名为“searchresults”的会话中 如果用户打开新选项卡并再次使用不同的条件进行搜索,搜索结果将存储在名为“searchresults”的会话
这个spring mvc有什么解决方案吗…这是因为浏览器将不同的选项卡视为同一个会话。您可以使用浏览器的开发工具检查从两个不同选项卡发送的会话cookie来确认这一点-它们将是相同的
因此,Spring正确地将来自不同选项卡的所有请求视为同一个会话。如果您希望用户能够在不同选项卡中进行单独的搜索,则必须以会话属性以外的方式管理搜索结果。这是因为浏览器将单独的选项卡视为同一个会话。Y您可以通过使用浏览器的开发工具检查从两个不同选项卡发送的会话cookie来确认这一点-它们将是相同的
因此,Spring正确地将来自不同选项卡的所有请求视为同一个会话。如果您希望用户能够在不同选项卡中进行单独的搜索,则必须以会话属性以外的方式管理搜索结果。这是因为浏览器将单独的选项卡视为同一个会话。Y您可以通过使用浏览器的开发工具检查从两个不同选项卡发送的会话cookie来确认这一点-它们将是相同的
因此,Spring正确地将来自不同选项卡的所有请求视为同一个会话。如果您希望用户能够在不同选项卡中进行单独的搜索,则必须以会话属性以外的方式管理搜索结果。这是因为浏览器将单独的选项卡视为同一个会话。Y您可以通过使用浏览器的开发工具检查从两个不同选项卡发送的会话cookie来确认这一点-它们将是相同的 因此,Spring正确地将来自不同选项卡的所有请求视为同一个会话。如果您希望您的用户能够在不同选项卡中进行单独的搜索,则必须以会话属性以外的方式管理搜索结果。是的,正如多个选项卡共享一个会话所说 处理这种情况的一种方法是在会话密钥中包含一个特定于选项卡的url组件。如果您在产品列表页面上,并且要为每个产品打开一个新选项卡,如果您确保打开选项卡时的url不同,例如,在url
/product/{product.id}中使用产品id
,要做出正确的行为,只需将id附加到会话键searchresults{product.id}
还有一个以@SessionAttribute为中心的解决方案,这是一个专门用于此目的的定制,在此处进行了描述,并基于所描述的旧博客。该解决方案实现了CustomSessionAttribute Testore,并维护一个地图地图,其中内部地图是deafult SessionAttribute,由对话id标识(在您的情况下,选项卡id)
整个项目发布在Yeps上,就像多个选项卡共享一个会话一样
处理这种情况的一种方法是在会话密钥中包含一个特定于选项卡的url组件。如果您在产品列表页面上,并且要为每个产品打开一个新选项卡,如果您确保打开选项卡时的url不同,例如,在url/product/{product.id}中使用产品id
,要做出正确的行为,只需将id附加到会话键searchresults{product.id}
还有一个以@SessionAttribute为中心的解决方案,这是一个专门用于此目的的定制,在此处进行了描述,并基于所描述的旧博客。该解决方案实现了CustomSessionAttribute Testore,并维护一个地图地图,其中内部地图是deafult SessionAttribute,由对话id标识(在您的情况下,选项卡id)
整个项目发布在Yeps上,就像多个选项卡共享一个会话一样
处理这种情况的一种方法是在会话密钥中包含一个特定于选项卡的url组件。如果您在产品列表页面上,并且要为每个产品打开一个新选项卡,如果您确保打开选项卡时的url不同,例如,在url/product/{product.id}中使用产品id
,要做出正确的行为,只需将id附加到会话键searchresults{product.id}
还有一个以@SessionAttribute为中心的解决方案,这是一个专门用于此目的的定制,在此处进行了描述,并基于所描述的旧博客。该解决方案实现了CustomSessionAttribute Testore,并维护一个地图地图,其中内部地图是deafult SessionAttribute,由对话id标识(在您的情况下,选项卡id)
整个项目发布在Yeps上,就像多个选项卡共享一个会话一样
处理这种情况的一种方法是在会话密钥中包含一个特定于选项卡的url组件
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);
}
}