response.sendRedirect显示不需要的HttpStatus 302而不是307

时间:2017-10-08 17:52:08

标签: java redirect httpresponse http-status-code-302 http-status-code-307

我有一个小测试,它应该返回带有HttpStatus Code 307的临时重定向的HttpStatus。
但它总是返回302.

@RestController
@RequestMapping(value = "/")
public class Controller {

    @ResponseStatus(HttpStatus.TEMPORARY_REDIRECT ) 
    @RequestMapping(value= "test", method = RequestMethod.GET)
    public void resolveUrl(HttpServletResponse response) throws IOException {
        response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
        response.sendRedirect("https://www.google.com");
    }
}

当我查看response.sendRedirect()的文档时,我可以阅读:

  

使用指定的方法向客户端发送临时重定向响应        *重定向位置网址。

documentation of temporary redirect is a 307

  

10.3.8 307临时重定向

     

请求的资源暂时驻留在不同的URI下。   由于重定向有时可能会改变,客户端应该这样做   继续使用Request-URI用于将来的请求。这个回应是   如果由Cache-Control或Expires标头指示,则仅可缓存   字段。

(我知道,我不需要@ResponseStatus(HttpStatus.TEMPORARY_REDIRECT)response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);,但我想表明它也无法解决这个问题!)

但我的测试显示它是302而不是307

  

java.lang.AssertionError:期望的状态:< 307>但是:< 302>

有人可以解释一下吗?

我对此的小考验:

@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void test() throws Exception {
        MockHttpServletRequestBuilder requestBuilder = get("/test");
        mvc.perform(requestBuilder).andExpect(status().isTemporaryRedirect())
                .andExpect(redirectedUrl("https://www.google.com"));
    }

}

Complete code can be found at github

1 个答案:

答案 0 :(得分:0)

代替使用sendRediect,在响应对象中设置Location标头。

    response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);

response.setHeader(“ Location”,“ https://we.google.com”);