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"));
}
}
1 ответ
Вместо этого используйте sendRediect, установите заголовок Location в объекте ответа.
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader ("Местоположение", " https://we.google.com/");