Android RestTemplate 403未找到预期的CSRF令牌

时间:2015-02-09 15:40:40

标签: android spring csrf http-status-code-403 resttemplate

我使用spring android将我的Android应用程序连接到Spring MVC和Spring安全性的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 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。 事实证明,从我的Android应用程序发送的任何请求应该具有给定JSESSIONID作为其值的Cookie标头。例如,“Cookie:JSESSIONID = 2C01F881A33 ..”。 Spring安全保存会话中我的Android应用程序请求的标记,因此我的Android应用程序请求必须具有由服务器先前给出的分配了JSESSIONID的Cookie标头。