2015-10-20 150 views
6

我在我的Spring MVC 3.2應用程序中遇到了奇怪的行爲,並且我注意到這隻發生在重定向以另一種方式完成時;所以我的問題是:在Spring MVC中,使用'redirect:process'或'redirect:/ process'會導致丟失的會話或會話值有何不同?

  1. 做 '重定向:/過程':重定向到一個內部控制 '的過程重定向' 任何不同 ?

    添加的斜槓是否有所作爲,如影響會話處理?

  2. 丟失會話(或會話屬性丟失)的原因是什麼?

    我通過我的應用程序讀到了一個值;即使我在很多情況下也會重定向,當我在控制器URI之前添加斜槓,生產時我有時會失去此值。

    關於如何排除丟失的會話值的任何線索?

注:我使用的方法httpRequest.getSession().setAttributehttpSession.getAttribute用於訪問會話。

+0

Stacktrace?錯誤?導致錯誤的代碼? –

+0

由於我從會話中獲取的值爲空,我得到一個NullPointerException。這在一天中會發生十幾次。 –

+0

這發生在GET控制器方法中,當我返回(作爲視圖名稱)值'重定向:/進程'。請注意,我無法在本地重現此操作。 –

回答

0

只是說明:/是斜線,反斜槓是\

除了因爲其他錯誤的外部原因,既redirect:processredirect:/process應該只要會話而言改變任何東西。

但是這兩個重定向是而不是應該做同樣的事情,除非你在根應用程序頁面上。假設您的應用程序在server.domain上的HTTP端口80上運行,並且servlet上下文爲myapp,並且您正在處理請求到http://server.domain/myapp/local/partredirect:process會要求瀏覽器請求http://server.domain/myapp/local/part/processredirect:/process會要求瀏覽器請求http://server.domain/myapp/process

接下來會發生什麼取決於您的控制器映射。

+0

這真是太奇怪了。我在控制器URI'http:// domain/app/result'上收到一個響應,但是我'重定向:進程'我正在觸發具有RequestMapping'進程'(而不是'結果/進程')的Controller。根據您的描述,這應該不可能 –

+0

控制器「/process.htm」的@RequestMapping值是什麼?如果是這樣,你有沒有嘗試使用「重定向:/process.htm」? – QuestionMarks

+0

不,沒有'.htm'後綴,我到達了我的正確控制器,但失去了會話,無論我做'重定向:進程'還是'重定向:/過程'都是一樣的。 –

1

'/'你聲明一個從根,這是你的servlet上下文路徑的路徑。沒有'/',通常它會轉到相對於當前子路徑的路徑。例如,如果你在'/ go/url',你的指向'/ go/url/next',而不是'/ next'。

我沒有檢查Spring的源代碼,但這是它通常在Web瀏覽器中的工作原理。

編輯:

對不起,Spring MVC中,你必須提供完整的路徑,而不是相對路徑。所以你應該做「重定向:/完整/路徑」。

+0

對,我現在用的是以'/'開頭的路徑,都很好。但是我沒有看到你的答案與失去的會話有關。 –

+0

你可能想仔細檢查你設置的值是不是在第一個地方... –

0

你可能想分析什麼導致了丟失的會話屬性。一種方法是實現您自己的HttpSessionAttributeListener並登錄public void attributeRemoved(HttpSessionBindingEvent event)實現。同時保持彈簧日誌級別進行調試。

+0

謝謝,但是我不能在生產中使用調試,並且這尚未在本地複製。所以我會實施你提到的,看看發生了什麼。 –