爲簡單起見,這些代碼片段將會縮短。這樣做的目的是獲取一個GET參數,將其設置在會話中,並在刪除url參數的情況下重定向回GET。基本上,URI清理。如果有更好/更簡單的方法來做到這一點,我會很高興聽到它。爲什麼SessionAttributes在GET重定向時被清除?
我有定義爲這樣的控制器:
@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
傳遞給handleUrlParam
方法並手動將myParam1
添加到Flash屬性來解決此問題,但這似乎破壞了我的想法。
爲什麼在重定向後SessionAttribute
myParam1
被刪除?
是否有更好的方法從URI中提取參數並將它們放在會話中?
UPDATE
如此看來,只要您使用RedirectAttributes
可言,你必須確保你把你想帶入的FlashAttributes重定向,否則他們將失去任何SessionAttribute
秒。我想象會發生這種情況,因爲SessionAttribute
被從ModelMap
拉下來(使用時被FlashAttributes取代)。這是Spring中的一個錯誤還是故意的行爲?如果這是故意的,有人可以解釋爲什麼?我認爲SessionAttribute
是爲了繼續下去,直到通過完成對話會議而被刪除。
Similar StackOverflow post here。
附錄
在提供的接受的答案來看,我仍然難倒,同時將它們放入用戶的會話我如何清除URI參數。我考慮過的一個選項是爲半原始對象(java.lang.Integer,java.lang.String)創建一個包裝器,因爲它們不會放在URI字符串上,所以我試圖存儲它,但是這似乎很難我。如果有人有更好的方法來接受GET參數,將它們存儲在用戶的會話中,並清除用戶地址欄中的內容(這將需要重定向),我會很樂意使用它。
我不知道你在做什麼錯,但我剛剛複製了你的配置,它按預期工作。這兩個屬性都以會話結束(這對於第二個屬性來說可能很奇怪,因爲它應該是flash屬性)。 –
奇數。我基本上放棄和設置兩個Flash屬性,它工作正常。它有點違背了使用'@ SessionAttribute'的目的,但是對於常規的'GET'請求,它按預期工作。感謝您的關注。 – Andy
我剛剛想到的一點是,不同於大多數人的配置是使用'BeanDefinition.SCOPE_PROTOTYPE'。你有沒有使用它,仍然得到正確的行爲?我很好奇,如果創建/使用新的控制器對象可能成爲問題的一部分。由於我們的攔截器和控制器結構,我們必須使用新鮮的物體,但這只是一個想法,是否可能是我的怪異行爲的責任。 – Andy