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

Android RestTemplate 403 Expected CSRF token not found

我使用 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 和消息 "Expected CSRF Token not found. Has your session expired?",但如果我从 Firefox RestClient 插件尝试它也使用 header X-CSRF-TOKEN,它工作得很好。

有人说 REST 客户端可以不使用 CSRF,但就我而言,我真的需要让它工作。

请大家帮帮我,谢谢。

我找到了问题的解决方案。 事实证明,从我的 android 应用程序发送的任何请求都应该将 Cookie header 指定为 JSESSIONID 作为其值。例如,"Cookie:JSESSIONID=2C01F881A33.."。 Spring 我的 android 应用程序请求的安全保存令牌在 session 中,因此我的 android 应用程序请求必须有 Cookie header 分配的 JSESSIONID 由服务器先前提供。