当前位置: 首页 > 知识库问答 >
问题:

Spring MVC@Sessionattributes在多个浏览器选项卡中发布

梁丘飞鸾
2023-03-14

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

我们正在使用Spring mvc的@Session属性来支持会话范围中的数据...

问题是当我们使用浏览器的多个选项卡时,它不能像预期的那样工作。.

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

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

如果用户打开新选项卡并再次使用不同的条件进行搜索,搜索结果将存储在名为“searchresults”的会话中。。

因此,如果用户重新加载第一个选项卡...他将se搜索结果无论在第二个选项卡...

所以会话中的“searchresults”将有来自第二个选项卡的结果…所以即使用户刷新第一个选项卡..他也会看到使用第二个选项卡得到的结果。。

这个Springmvc有什么解决方案吗。。。

共有2个答案

宋俊民
2023-03-14

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

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

宋华美
2023-03-14

是的,正如lewthor所说,多个选项卡共享一个会话。

处理这种情况的一种方法是在会话密钥中包含一个特定于选项卡的url组件。如果您在产品列表页面上,并且要为每个产品打开一个新选项卡,如果您确保打开选项卡时的url不同,例如,通过在url/product/{product.id}中使用产品id,那么您所要做的就是将id附加到会话键搜索结果{product.id}

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

 类似资料:
  • 我正在创建一个“主”谷歌工作表的基础上的谷歌工作表文件文件夹(目前6个文件)。每个工作表的选项卡数量略有不同(有些名称略有不同),但我想循环一个公式以获取每个工作表文件中每个选项卡的值。(例如,fileA有3个选项卡,我想从每个选项卡中获取数据,并在fileB中重复类似的操作,fileB有4个选项卡)。我还想跳过几个命名选项卡。 下面是我的一段代码(2个交错函数): 但是,这只是从每个文件中的一个

  • 我遇到了一个有用的PDF生成代码,用于在Spring MVC应用程序中向客户机显示文件(“使用Spring MVC返回生成的PDF”): 我添加了一个声明,该方法返回一个PDF文件(“Spring 3.0 Java REST return PDF Document”):。 我的问题是,当上面的代码执行时,它立即要求客户机保存PDF文件。我希望PDF文件首先在浏览器中查看,这样客户端就可以决定是否保

  • 问题内容: 嗨,我想知道如何在浏览器选项卡关闭时提示消息。我正在使用Reactjs。 这是我尝试添加到我的react组件中的内容。请指导我如何继续进行。 问题答案: 除了事件名称和警报将在该特定事件中阻止这一事实之外,您所做的都是正确的。 您可以显示如下消息: 希望这可以帮助。

  • 问题内容: 我正在使用MozillaFirefox,并且试图找到一种使用JavaScript和DOM访问同一窗口中其他选项卡的内容的方法(如果存在,我可以接受其他技术)。 例如, 我想运行一个JavaScript,在其中可以找到其他标签的标题。基本上,我需要这样做,以便可以标识由于当前页面中的而已打开的选项卡,而无需使用方法。我只需要一个简单的超级链接,即可打开与当前页面属于同一域的页面(该页面应

  • 问题内容: 我想知道是否可以通过Spring Security验证用户会话,从而仅打开一个浏览器选项卡。可能吗? 我还想知道是否可以执行以下操作:当用户关闭该选项卡并在会话结束之前从直接应用程序中再次打开它之前,将其打开,而无需转到登录屏幕。 我正在使用JSF 1.2,RichFaces 3.3.3,Hibernate和Co … 详细信息:我知道弹簧安全性,我正在研究它。 现在,谢谢我的英语不好。

  • 我试图编写一个函数,它将接收一个“浏览器实例”(我指的是),并打开一个带有特定URL的新选项卡。 这是函数: 返回True(如果URL有效) 如果有人能告诉我我做错了什么,我将非常感激。如果您有其他方法来完成打开新选项卡的任务,这是可以的。顺便说一下,我曾尝试使用:,但没有成功(我没有得到新的选项卡,也没有异常)