response.sendRedirect показывает нежелательный HttpStatus 302 вместо 307

У меня есть небольшой тест, который должен вернуть HttpStatus с временным перенаправлением с HttpStatus Code 307.
Но это всегда возвращает 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() Я могу прочитать это:

Отправляет клиенту временный ответ на перенаправление, используя указанный * адрес местоположения перенаправления.

и документация временного перенаправления 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"));
    }

}

Полный код можно найти на GitHub

1 ответ

Вместо этого используйте sendRediect, установите заголовок Location в объекте ответа.

    response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);

response.setHeader ("Местоположение", " https://we.google.com/");

Другие вопросы по тегам