防止Spring MVC遵循重定向

时间:2015-07-07 10:45:23

标签: spring spring-mvc

我的Spring Boot应用程序中有以下类:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.google.common.net.HttpHeaders;

@Controller
public class TestController {
  @RequestMapping("foo")
  public ResponseEntity<?> redirectOnGet() {
    return ResponseEntity.status(HttpStatus.FOUND).header(HttpHeaders.LOCATION, "http://www.bbc.co.uk").build();
  }
}

当我通过GET请求调用它时,我得到200 OK,其中包含BBC.co.uk的HTML源代码。所以看起来正在遵循重定向。

根据HTTP spec section 10.3.3

  

如果收到302状态代码以响应GET或HEAD以外的请求,则除非用户可以确认,否则用户代理不得自动重定向请求

此外,它特定于非GET响应,它并不表示GET请求应该重定向。因此,尽管在某些情况下它可能会有所帮助,但这并非如此,我想避免重定向。

那么有人知道如何在返回对GET请求的响应时不遵循302重定向吗?我将返回的响应将遵循302本身。

查看SimpleClientHttpRequestFactory,这可能是我可以解决问题的地方。但是在超越班级和班级之后通过@Bean公开它,我的被覆盖的方法没有被调用。我猜它没被拿起来。

这里有一个项目说明了这个问题:https://github.com/LTheobald/StackOverflow31266409

测试案例可能是最值得关注的事情。基于MockMVC的方法完成了我的预期,基于RestTemplate的方法没有。这是因为RestTemplate设置为遵循重定向,而TestRestTemplate(我假设MockMVC使用)不遵循重定向。那么,当调用控制器时,如何让我的应用程序更像TestRestTemplate?

注意关于可能的重复:How can I prevent Spring MVC from doing a redirect?。这个问题没有足够的信息来说明为什么它会重定向。原来的海报可能只是简单地返回“重定向:某种东西”而Spring会做正确的事情。

1 个答案:

答案 0 :(得分:0)

试图在Boot示例项目中重现此问题但不能(使用Spring Boot 1.2.4和1.3.0.M1)。

➜  curl -v http://localhost:8080/foo
> GET /foo HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< Location: http://www.bbc.co.uk
< Content-Length: 0
< Date: Wed, 08 Jul 2015 20:27:41 GMT
<

您能否分享一下有关Spring MVC Web配置的更多信息? 您使用的是哪个servlet容器?

注意:您的示例中存在拼写错误,导致错误的HttpHeaders实现。

修改

您的控制器正在返回有效的HTTP 302响应。 现在,HTTP客户端可以使用该响应执行所需操作。如果您查看SimpleClientHttpRequestFactory,如果您没有将RestTemplate配置为另一个(Apache httpComponents,Netty 4,OkHttp),则默认为RestTemplate。默认情况下,此RequestFactory遵循GET请求的重定向。

所以有两个解决方案:

  • 您将RequestFactory配置为使用不遵循重定向的其他{{1}}。
  • 或者你坚持使用mockMvc,这可能对这些情况更好,因为你可以在不启动Servlet容器的情况下使用它,具体取决于你的使用情况(=更快的测试!)
相关问题