2016-08-11 51 views
1

我有angular2應用程序並使用Tomcat來獲取數據。我不希望任何頁面重新加載或重定向,我需要的只是數據,所以來自服務器的所有響應都有@ResponseBody註釋。Spring @ResponseBody不能使用會話

我的問題是,由於這個註釋我無法獲得用戶會話變量。當我登錄時創建會話,將用戶數據存儲在其中,但在下次調用時無法獲取。

@JsonIgnoreProperties(ignoreUnknown = true) 
@RequestMapping(method = RequestMethod.POST) 
@ResponseBody 
public String login(HttpServletRequest REQ, @RequestBody String BODY) throws Exception 
{ 
      ...check if all ok... 
       REQ.getSession().setAttribute("user", user); 
      ... return user data... 
} 

有沒有其他辦法,我可以把我的數據返回給客戶端,連同所需的數據,以便能夠使用會話。

編輯: 問題不在服務器端,而是客戶端。默認情況下,Angular不會在跨域請求中發送cookie JSESSIONID。

+0

「無法獲取用戶會話變量」是什麼意思?不編譯?它會崩潰嗎?它是否返回無效或空數據?你會得到什麼錯誤信息? – Codo

+0

這與angular2無關,因此您可能需要刪除該標籤。 –

+0

@Koos Gadellaa我只是想寫 - 這與Spring和可能甚至Java無關:)取決於我的觀點。 –

回答

1

首先檢查您的請求/響應(例如在Chrome開發工具中)。 Tomcat創建一個名爲JSESSIONID的新cookie,將客戶端與服務器會話對象綁定,因此請在您的登錄方法響應頭中查找該cookie。然後確保您在下次請求時將此cookie發回您的服務器。會話創建與Spring@ResponseBody無關,它的生命週期由容器(Tomcat)管理。

此外,如果您正在提出跨域請求,請檢查this answer

+0

謝謝你的回答。我搞砸了,在錯誤的地方搜索。問題在於跨域請求(CORS)和angular2。該鏈接讓我更進一步this.http.get('http:// ...',{withCredentials:true})。現在,下一個請求在標題中也有cookie。我仍然遇到問題,因爲cookie與set-cookie從服務器發送的不同。如果該呼叫不是CORS,則不會發生這種情況。 – FGHJ

1

你放在會話上下文中的任何東西都不可用於客戶端,它只對服務器可用。請參閱this stack overflow post以獲得有關servlet如何工作的詳細說明,特別是有關會話狀態如何工作的部分。

正如您所看到的,它通過向包含session-Id的響應添加會話cookie來工作。服務器將會話狀態存儲在內存中的該id下,並且當該會話id附帶未來請求時,它會使會話狀態再次對未來的請求可用。

如果您的下一個請求無法訪問會話狀態,則很可能會話cookie不能正確傳播。我建議你先檢查一下。它應該在您登錄的響應中,並且應該在對服務器的進一步請求中發佈。