【问题标题】:SessionAttributes when open new browser tabs打开新浏览器选项卡时的 SessionAttributes
【发布时间】:2021-06-06 02:40:26
【问题描述】:

我有一个 Spring-mvc 应用程序,在每个控制器中,我向 SessionAttributes 添加一个表单,以便在保存、删除或执行另一个获取请求时保留属性。当我尝试在另一个浏览器选项卡中打开某个链接并尝试提交第一个链接时,主要问题就出现了。我尝试了this 解决方案,但是当我执行重定向时(在控制器中,我只有 1 个返回视图,其他方法执行重定向)它会创建一个新对话并且找不到之前的对话。

我还有一个关于尝试使用 spring-session 的问题,问题是 here,但我不知道这是否也可以。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    您是否查看过 Spring 的 RedirectAttributes?我自己没有使用过它,但听起来它应该做你想做的事。 RedirectAttributes 通常用于 GET/redirect/POST 模式,at least one user 似乎认为以这种方式传递会话属性是不好的做法,但是他们继续提到似乎没有更好的解决方案。无论如何,文档中显示的示例:

    @RequestMapping(value = "/accounts", method = RequestMethod.POST)
    public String handle(Account account, BindingResult result, RedirectAttributes redirectAttrs) {
        if (result.hasErrors()) {
            return "accounts/new";
        }
        // Save account ...
        redirectAttrs.addAttribute("id", account.getId()).addFlashAttribute("message", "Account created!");
        return "redirect:/accounts/{id}";
    }
    

    会将“message”属性添加到 RedirectModel,如果您的控制器重定向,那么处理重定向的任何方法都可以像这样访问该数据:

    @RequestMapping(value = "/accounts", method = RequestMethod.POST)
    public String handleRedirect(Model model) {
        String message = (String) model.asMap().get("message");
        return new ModelAndView();
    }
    

    所以添加会话属性应该可以以相同的方式进行。另一个参考here

    编辑 我正在查看 Spring 文档,他们还提到了这个注释 @SessionAttributes。来自文档:

    类型级别的@SessionAttributes 注释声明特定处理程序使用的会话属性。这通常会列出模型属性的名称或模型属性的类型,它们应该透明地存储在会话或某些会话存储中,作为后续请求之间的表单支持 bean。

    这是你需要的吗?

    还有a link to documentation on flash attributes

    【讨论】:

    • redirectAttributes 的主要问题是,如果它们不是 html 的形式,我需要将所有变量放在单独的属性中。
    【解决方案2】:

    这是我们想出的解决方案,与Spring无关:

    1. 在应用程序的每个 html 表单中,您都必须包含一个隐藏字段。让我们将此字段命名为 CSRF_TOKEN。该字段应该有一个随机生成的值。该值同时放置在会话和隐藏字段中。会话属性的名称是 SESSION_CSRF_TOKEN

    2. 当表单提交到服务器时,检查会话中的值(SESSION_CSRF_TOKEN)是否等于HTTP请求参数CSRF_TOKEN中发送的值。如果没有,您会显示某种错误消息并停止处理。如果它们相等,则继续。

    如果用户打开一个新标签或复制一个标签,服务器将重新渲染页面并生成一个新的 CSRF_TOKEN。因此,用户将只能从新打开的选项卡提交表单,而不能从原始选项卡提交。

    此解决方案提供了额外的好处:它可以防止CSRF attacks

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2015-06-11
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多