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