当前位置: 首页 > 知识库问答 >
问题:

是否使用Spring restTemplate执行302重定向?

柴坚诚
2023-03-14
  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会自动被跟踪。我的这个假设是错误的吗?我现在需要选择这个位置并重新请求

共有3个答案

麹凯捷
2023-03-14

当使用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());
常英纵
2023-03-14

您是否试图从一个协议重定向到另一个协议,例如从http重定向到https,或者反之亦然?如果是这样,自动重定向将不起作用。请参阅此注释:URLConnection不遵循重定向

经过Java网络工程师的讨论,我们认为我们不应该自动遵循从一个协议到另一个协议的重定向,例如,从超文本传输协议到https,反之亦然,这样做可能会产生严重的安全后果

从https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4620571

否则,如果调试RestTemplate代码,您将看到默认情况下,HttpURLConnection的设置正确,getInstanceFollowRedirects()==true。

苏乐
2023-03-14

使用默认的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