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 由服务器先前提供。
我使用 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 由服务器先前提供。