starter - El prefijo Spring MVC "redirect:" siempre redirecciona a http, ¿cómo puedo mantenerlo en https?
spring tutorial (5)
¿Estás seguro?
Al mirar el código, parece que no hay diferencia. Ambas variantes llaman a response.encodeRedirectURL (targetUrl), vea la línea 388 de RedirectView:
if (http10Compatible) {
// Always send status code 302.
response.sendRedirect(response.encodeRedirectURL(targetUrl));
}
else {
HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);
response.setStatus(statusCode.value());
response.setHeader("Location", response.encodeRedirectURL(targetUrl));
}
Tuve el mismo problema, pero se desencadenó al configurar tomcat detrás de un loadbalancer. El loadbalancer realiza el protocolo de enlace SSL y reenvía a tomcat una conexión http simple.
La solución sería enviar un encabezado Http especial en su Loadbalancer, para que tomcat pueda "confiar" en esta conexión. El uso de un filtro de servlet debe establecer la bandera response.isSecure. Luego sobrescriba RedirectView para ver si response.isSecure y maneje de la manera correcta.
Mantuve esta solución corta porque no estoy seguro de si la pregunta es compleja.
Lo resolví yo mismo, pero pasé tanto tiempo descubriendo una solución tan simple, pensé que merecía ser documentada aquí.
Tengo una configuración Spring 3 MVC típica con un InternalResourceViewResolver:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
Tengo un método de manejo bastante simple en mi controlador, pero lo he simplificado aún más para este ejemplo:
@RequestMapping("/groups")
public String selectGroup() {
return "redirect:/";
}
El problema es que si navego a https://my.domain.com/groups
, termino en http://my.domain.com/
después del redireccionamiento. (En realidad, mi equilibrador de carga redirige todas las solicitudes http a https, pero esto solo causa varias alertas del navegador del tipo "Usted está dejando / ingresando una conexión segura" para las personas que tienen activadas tales alertas).
Entonces la pregunta es: ¿cómo se consigue que la primavera redirija a https cuando eso es lo que usaba la solicitud original?
La respuesta corta es establecer la propiedad RedirectHttp10Compatible de InternalResourceViewResolver en false:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
<property name="redirectHttp10Compatible" value="false" />
</bean>
En su lugar, podría hacerlo en base a una solicitud, haciendo que su método del manejador devuelva View en lugar de String y cree RedirectView usted mismo, y llamando a setHttp10Compatible(false)
.
(Resulta que el culpable es HttpServletResponse.sendRedirect, que RedirectView usa para los redireccionamientos compatibles con HTTP 1.0, pero no de otra manera. Supongo que esto significa que depende de la implementación de su contenedor de servlets (?); Observé el problema tanto en Tomcat como en Jetty. )
Lo que funcionó para mí es agregar esto a application.properties server.tomcat.use-relative-redirects=true
Entonces cuando tienes:
public function redirect() {
return "redirect:/"
}
Sin los server.tomcat.use-relative-redirects
will agregará un encabezado Location
como: http://my-host.com/
. Con server.tomcat.use-relative-redirects
se verá como: /
. Por lo tanto, será relativo a la página actual desde la perspectiva del navegador.
Spring Boot proporciona esta buena solución basada en la configuración si está ejecutando detrás de un servidor proxy, simplemente agregue estas dos propiedades a su archivo application.properties
:
server.tomcat.remote_ip_header=x-forwarded-for
server.tomcat.protocol_header=x-forwarded-proto
Esto funciona para mí implementando el spring-boot-sample-web-ui otra manera sin cambios en Elastic Beanstalk detrás de un balanceador de carga https. Sin estas propiedades, la redirección en la línea 68 del MessageController
predetermina a http y se cuelga.
Espero que esto ayude.
si usa springmvc, puede intentar lo siguiente:
modelAndView.setView(new RedirectView("redirect url path", true, false));