Spring RestTemplate 重定向 302

11

我正在尝试使用Spring RestTemplate进行POST请求以登录。

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

LinkedMultiValueMap<String, Object> mvm = new LinkedMultiValueMap<String, Object>();
mvm.add("LoginForm_Login", "login");
mvm.add("LoginForm_Password", "password");

ResponseEntity<String> result = restTemplate.exchange(uriDWLogin, HttpMethod.POST, requestEntity, String.class);

我的 ResponseEntity 状态是 302,我希望跟随此请求获取响应主体,因为我没有收到此请求的响应主体。

18:59:59.170 MAIN [http-nio-8080-exec-83] DEBUG c.d.s.c.DemandwareCtlr - loginToSandbox - StatusResponse - 302
18:59:59.170 MAIN [http-nio-8080-exec-83] DEBUG c.d.s.c.DemandwareCtlr - loginToSandbox - BodyResponse - 

我该怎么做才能解决这个问题?!

1个回答

30

如果请求是GET请求,重定向将自动跟随(请参见此答案)。要使其在POST请求中发生,一种选择可能是使用不同的请求工厂,例如HttpComponentsClientHttpRequestFactory,并将其设置为使用具有所需设置以跟踪重定向的HttpClient(请参见LaxRedirectStrategy):

final RestTemplate restTemplate = new RestTemplate();
final HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
final HttpClient httpClient = HttpClientBuilder.create()
                                               .setRedirectStrategy(new LaxRedirectStrategy())
                                               .build();
factory.setHttpClient(httpClient);
restTemplate.setRequestFactory(factory);

我没有测试过,但这应该可以工作。


谢谢你的帮助,它起作用了,现在我需要获取“Cookie”而不是“Set-cookie”,我该怎么做? - Aliyon
1
只需从头文件中获取“Set-Cookie”,就像处理cookie一样,result.getHeaders().get("Set-Cookie").get(0).split(";")[0]; - chrismarx
1
如果在类路径上存在org.apache.httpcomponents:httpclient,则RestTemplate的行为将不同 - 它不会在GET请求中遵循重定向(使用默认构造函数)。 - Mateusz Stefek
1
SimpleClientHttpRequestFactory 不会遵循重定向(redirects),它只会遵循一个重定向(redirect)。 - Skeeve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接