RestTemplate restTemplate = new RestTemplate();
final MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter();
final List<MediaType> supportedMediaTypes = new LinkedList<MediaType>(converter.getSupportedMediaTypes());
supportedMediaTypes.add(MediaType.ALL);
converter.setSupportedMediaTypes(supportedMediaTypes);
restTemplate.getMessageConverters().add(converter);
ResponseEntity<MyDTO[]> response = restTemplate.getForEntity(urlBase, MyDTO[].class);
HttpHeaders headers = response.getHeaders();
URI location = headers.getLocation(); // Has my redirect URI
response.getBody(); //Always null
我的印象是302会自动被跟踪。我的这个假设是错误的吗?我现在需要选择这个位置并重新请求?
当使用CommonClientHttPrequestFactory(在下面使用HttpClient v3)时,可以重写PostProcessCommonHttpMethod方法并设置为遵循重定向。
public class FollowRedirectsCommonsClientHttpRequestFactory extends CommonsClientHttpRequestFactory {
@Override
protected void postProcessCommonsHttpMethod(HttpMethodBase httpMethod) {
httpMethod.setFollowRedirects(true);
}
}
然后,您可以这样使用它(带有可选的,可能是预配置的HttpClient实例),请求将遵循位置
标头作为响应:
RestTemplate restTemplate = new RestTemplate(
new FollowRedirectsCommonsClientHttpRequestFactory());
您是否试图从一个协议重定向到另一个协议,例如从http重定向到https,或者反之亦然?如果是这样,自动重定向将不起作用。请参阅此注释:URLConnection不遵循重定向
经过Java网络工程师的讨论,我们认为我们不应该自动遵循从一个协议到另一个协议的重定向,例如,从超文本传输协议到https,反之亦然,这样做可能会产生严重的安全后果
从https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4620571
否则,如果调试RestTemplate代码,您将看到默认情况下,HttpURLConnection的设置正确,getInstanceFollowRedirects()==true。
使用默认的ClientHttpPrequestFactory实现(即SimpleClientHttpRequestFactory),默认行为是遵循位置标头的URL(对于状态代码为3xx的响应),但仅当初始请求是GET请求时。
可以在此类中找到详细信息-搜索以下方法:
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
...
if ("GET".equals(httpMethod)) {
connection.setInstanceFollowRedirects(true);
}
这里是HttpURLConnection.setInstanceFollowReDirects
方法的相关文档注释:
设置HTTP重定向(响应代码为3xx的请求)是否应自动后跟此{@code HttpURLConnection}实例。
默认值来自followRedirects,默认为true。
我正在尝试使用SpringREST模板进行post请求以登录。 我的ResponseEntity状态是302,我想按照此请求获取正文响应,因为我没有获取此请求的正文。 我能做些什么来解决这个问题?!
问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果你调用 如果你调用 如果JVM首先崩溃 如果JVM在或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程
问题内容: 是否有可能以某种方式停止或终止JavaScript,从而防止再次发生基于JavaScript的执行,而无需重新加载浏览器? 我在想JavaScript等同于PHP。 问题答案: 简短答案: 如果您想了解更多,请继续阅读。 您是否要停止JavaScript的开发/调试工作? 代码中的表达式将停止页面执行,然后您的浏览器开发人员工具将使您可以查看页面冻结时的状态。 您是否要故意停止设计您的
问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 System.exit() 如果您调用 Runtime.getRuntime().halt(exitStatus) 如果JVM首先崩溃 如果JVM在try或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM
问题内容: python解释器具有 模块 选项“将库模块 模块 作为脚本运行”。 使用此python代码a.py: 我测试了 而回报 对我来说,这两个调用似乎是相同的,只是当用-m选项调用__package__时不为None。 有趣的是,有了,我得到了与编译成a.pyc的python模块相同的东西。 这些调用之间的(实际)区别是什么?它们之间有什么利弊? 同样,David Beazley的Pyth
python解释器具有模块选项,该选项“将库模块作为脚本运行”。 使用此python代码a.py: 我测试了以获得 而返回 对我来说,这两个调用似乎是相同的,只是当使用-m选项调用时,包不是None。 有趣的是,使用,我得到了与相同的结果,其中python模块被编译为a.pyc。 这些调用之间的(实际)区别是什么?他们之间有什么利弊吗? 另外,David Beazley的Python Essent