2015-02-09 66 views
0

我使用spring android將我的android應用程序連接到由Spring MVC和Spring安全性創建的Web服務。Android RestTemplate 403未找到期望的CSRF令牌

這是代碼片段連接到Web服務:

RestTemplate restTemplate = new RestTemplate(); 
restTemplate.getMessageConverters().add(new GsonHttpMessageConverter()); 
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 
String token = getToken(context); 
HttpHeaders httpHeader = new HttpHeaders(); 
httpHeader.add(RestTemplateHelper.CSRF_TOKEN_HEADER, token); 
httpHeader.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity requestEntity = new HttpEntity(message,httpHeader); 
responseEntity = rest.exchange(params[0],HttpMethod.POST, requestEntity, 
GetBalanceResponse.class); 

RestTemplateHelper.CSRF_TOKEN_HEADER是X-CSRF-TOKEN。此代碼段總是給我帶錯誤403消息「未找到期望的CSRF令牌,您的會話過期了嗎?」但如果我從Firefox RestClient插件嘗試使用標題X-CSRF-TOKEN,它也能正常工作。

有人說,REST客戶端可以不使用CSRF,但在我的情況下,我真的需要做這個工作。

請幫助我們,謝謝。

回答

1

我發現了我的問題的解決方案。 原來,我的Android應用程序發送的任何請求都應具有Cookie標頭,並將JSESSIONID作爲其值。例如,「Cookie:JSESSIONID = 2C01F881A33 ..」。 Spring安全保存會話中我的android應用程序請求的標記,因此我的android應用程序請求必須具有Cookie標頭,該標頭指定了服務器以前給出的JSESSIONID。