在Spring MVC中,使用"redirect:process"或"redirect:/process"在导致会话或会话值丢失方面是否有不同?



我在Spring MVC 3.2应用程序中遇到了奇怪的行为,我注意到这只发生在重定向以另一种方式完成时;所以我的问题是:

  1. 正在做'redirect:/process' any不同于'redirect:process'用于重定向到内部控制器?

  2. 添加斜杠是否有任何影响,例如影响会话处理?
  3. 会话丢失(或会话属性丢失)的原因是什么?

    我在应用程序中读取了一个值;即使我在许多情况下进行重定向,当我在控制器URI之前添加斜杠时,在生产上,我有时会失去这个值。

    关于如何排除丢失的会话值的任何线索?

注意:我使用httpRequest.getSession().setAttributehttpSession.getAttribute方法来访问会话

使用'/'声明从根目录的路径,这是您的servlet上下文路径。如果没有'/',它通常会指向一个相对于你当前子路径的路径。例如,如果你在'/go/url',你指向的是'/go/url/next',而不是'/next'。

我没有检查spring源代码,但这就是它在web浏览器中的工作方式。

编辑:

对不起,在Spring MVC中,您必须始终提供完整路径,而不仅仅是相对路径。所以你应该输入"redirect:/full/path"

注意:/是斜杠,反斜杠是

除了外部原因导致的其他错误,redirect:processredirect:/process都不应该改变任何东西,只要会话有关。

但这两个重定向是不是应该做同样的事情,除非你是在根应用程序页面。假设您的应用程序在服务器上的HTTP端口80上运行。域,使用myapp的servlet上下文,并且您正在处理对http://server.domain/myapp/local/part的请求,redirect:process将要求浏览器请求http://server.domain/myapp/local/part/process,当redirect:/process将要求浏览器请求http://server.domain/myapp/process时。
接下来会发生什么取决于你的控制器映射。

您可能想要分析导致会话属性丢失的原因。一种方法是实现您自己的httpessionattributelistener并登录public void attributeRemoved(HttpSessionBindingEvent event)实现。

最新更新