Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SessionAttributes在get redirect上被清除?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 为什么SessionAttributes在get redirect上被清除?

Java 为什么SessionAttributes在get redirect上被清除?,java,spring,spring-mvc,Java,Spring,Spring Mvc,为了简单起见,这些代码片段将被缩短。这样做的目的是获取一个GET参数,在会话中设置它,并在删除url参数的情况下重定向回GET。基本上,URI清理。如果有更好/更简单的方法,我很乐意听到 我有一个这样定义的控制器: @Controller @RequestMapping("/path/page.xhtml") @Scope(BeanDefinition.SCOPE_PROTOTYPE) @SessionAttributes({ "myParam1", "myParam2" }) public c

为了简单起见,这些代码片段将被缩短。这样做的目的是获取一个GET参数,在会话中设置它,并在删除url参数的情况下重定向回GET。基本上,URI清理。如果有更好/更简单的方法,我很乐意听到

我有一个这样定义的控制器:

@Controller
@RequestMapping("/path/page.xhtml")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@SessionAttributes({ "myParam1", "myParam2" })
public class MyController {

  @RequestMapping(method = RequestMethod.GET, params = { "urlParam2" })
  public String handleUriParam(@RequestParam(value = "urlParam2", required = false)
                               final Long urlParam2,
                               final RedirectAttributes redirs) {
    // at this point, myParam1 is set on the session.
    // now set the param as a flash attrib with the name of the session variable
    redirs.addFlashAttribute("myParam2", urlParam2);
    return "redirect:/path/page.xhtml";
  }

  @RequestMapping(method = RequestMethod.GET, params = {})
  public String doGetStuff(ModelMap model) {
    // do stuff using myParam1 and myParam2.
    // problem is, myParam2 is on the session, but myParam1 is not!
  }

}
正如代码所说,当重定向发生时,
myParam1
被取消设置。我可以通过将
ModelMap
传递给
handleurparam
方法并手动将
myParam1
添加到flash属性来解决这个问题,但这似乎违背了我的目的

为什么重定向后会删除
SessionAttribute
myParam1

有没有更好的方法从URI中提取参数并将其放到会话中

更新

因此,无论何时使用
RedirectAttributes
,都必须确保在FlashAttributes上放入任何要进行重定向的
SessionAttribute
s,否则它们将丢失。我想这是因为
SessionAttribute
s从
ModelMap
(使用时会被FlashAttributes替换)中拔出。这是Spring中的bug还是故意的行为?如果是故意的,有人能解释一下原因吗?我想,
SessionAttribute
s应该一直保留,直到会话结束为止

附录


根据提供的已被接受的答案,我仍然不知道如何在用户会话中清除URI参数。我考虑过的一个选项是为我试图存储的半原语对象(java.lang.Integer、java.lang.String)创建一个包装器,因为它们不会被放在URI字符串上,但这对我来说似乎有点不方便。如果有人有更好的方法来接受GET参数,将它们存储在用户会话中,并从用户地址栏中清除这些参数(这需要重定向),我将很乐意使用它。

因此我在代码和Internet上查找它为什么不起作用

Spring有两个完全独立的模型映射—一个用于标准视图渲染,另一个用于发出重定向时。这可以从中观察到

现在会话属性持久化已经完成。对于重定向场景,这将返回重定向模型。因此,您在标准
模型
/
模型映射
上设置的任何内容都将丢失

在讨论标准模型属性时,这是有意义的。模型主要用于将对象传递给视图。使用重定向时,您正在处理完全不同的情况。您希望通过HTTP重定向传输对象,因此采用了基于字符串和flash的分离模型

然而,我的感觉是,他们忘记了会话属性。有一些好的,但没有一个解决这个具体问题


所以是的。。。这可能是Spring的Jira的一个主题。而且它可能被归类为一个bug,因为这会阻止任何人在使用重定向时设置会话模型属性。通过
重定向属性#addFlashAttribute
强制Spring存储会话属性是一种黑客行为,它本身就是一种缺陷

我不知道你做错了什么,但我刚刚复制了你的配置,它可以正常工作。这两个属性都在会话中结束(第二个属性可能很奇怪,因为它应该是flash属性)。我基本上让步了,将两者都设置为flash属性,效果很好。它有点违背了使用
@SessionAttribute
的目的,但是对于常规的
GET
请求,它可以正常工作。感谢您的关注。我刚刚想到的与大多数人的配置不同的一点是使用
BeanDefinition.SCOPE\u PROTOTYPE
。你使用了它,还是得到了正确的行为吗?我很好奇,新控制器对象的创建/使用是否是问题的一部分。由于我们的拦截器和控制器结构,我们必须使用新的对象,但这只是一个想法,它是否可能是我奇怪行为的原因。是的,它也适用于原型范围。您所说的“对于常规GET请求,它按预期工作”是什么意思?您最初是如何在会话中设置myParam1的?您是在使用
ModelMap
还是直接使用
HttpSession
?现在我能够重现该行为。。。虽然我同意你关于这是一个黑客行为的评论,但我仍然需要清除用户地址栏中的URI参数。有没有一种比我目前尝试的方式更不“黑客”的方法呢?另外,谢谢你的关注。你的解释很透彻,很有道理