tag mvc form docs spring spring-mvc cors response-headers

spring - mvc - agregar automáticamente encabezado a cada respuesta



taglib spring html (6)

Quiero agregar este encabezado "Access-Control-Allow-Origin", "*" a cada respuesta realizada al cliente cada vez que se realiza una solicitud de controladores de reposo en mi aplicación para permitir el intercambio de recursos de origen cruzado Actualmente estoy agregando manualmente este encabezado a todos y cada uno de los métodos como este

HttpHeaders headers = new HttpHeaders(); headers.add("Access-Control-Allow-Origin", "*");

Está funcionando pero es muy frustrante. Encontré webContentInterceptor en Spring Docs que nos permiten modificar encabezados en cada respuesta

<mvc:interceptors> <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> <property name="Access-Control-Allow-Origin" value="*"/> </bean> </mvc:interceptors>

pero cuando uso esto arroja el error de que la propiedad no encontrada del nombre Access-Control-Allow-Origin entonces hay otra forma en que podemos agregar encabezado automáticamente a cada respuesta

Actualización! Spring framework 4.2 simplifica mucho esto al agregar la anotación @CrossOrigin a un método o a un controlador https://spring.io/blog/2015/06/08/cors-support-in-spring-framework



En la primavera 4, puede usar @CrossOrigin () que le permite el problema de origen cruzado.

Por razones de seguridad, los navegadores prohíben las llamadas AJAX a recursos que residen fuera del origen actual. Por ejemplo, cuando revisa su cuenta bancaria en una sola pestaña, puede tener el sitio web de evil.com en otra pestaña. Los scripts de evil.com no deberían poder realizar solicitudes AJAX a su API bancaria (¡retirar dinero de su cuenta!) Utilizando sus credenciales.

El uso compartido de recursos de origen cruzado (CORS) es una especificación W3C implementada por la mayoría de los navegadores que le permite especificar de manera flexible qué tipo de solicitudes de dominio cruzado están autorizadas, en lugar de utilizar hacks menos seguros y menos potentes como IFrame o JSONP.

Spring Framework 4.2 GA brinda soporte de primera clase para CORS out-of-the-box, ofreciéndole una manera más fácil y poderosa de configurarlo que las soluciones típicas basadas en filtros.

Puede agregar una anotación @CrossOrigin a su método de manejo anotado @RequestMapping para habilitar CORS en él. De forma predeterminada, @CrossOrigin permite todos los orígenes y los métodos HTTP especificados en la anotación @RequestMapping:

@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @RequestMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, path = "/{id}") public void remove(@PathVariable Long id) { // ... } }

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

https://spring.io/guides/gs/rest-service-cors/

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework


Recientemente me metí en este tema y encontré esta solución. Puede usar un filtro para agregar estos encabezados:

import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.filter.OncePerRequestFilter; public class CorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { response.addHeader("Access-Control-Allow-Origin", "*"); if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) { // CORS "pre-flight" request response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.addHeader("Access-Control-Allow-Headers", "X-Requested-With,Origin,Content-Type, Accept"); } filterChain.doFilter(request, response); } }

No olvides agregar el filtro a tu contexto de primavera:

<bean id="corsFilter" class="my.package.CorsFilter" />

y el mapeo en el web.xml:

<filter> <filter-name>corsFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>corsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Para ir un poco más allá, puede especificar un perfil de Spring para habilitar o deshabilitar este filtro con algo como eso:

<beans profile="!cors"> <bean id="corsFilter" class="my.package.FilterChainDoFilter" /> </beans> <beans profile="cors"> <bean id="corsFilter" class="my.package.CorsFilter" /> </beans>

(proporcionando FilterChainDoFilter similar al CorsFilter pero que solo filterChain.doFilter(request, response); en doFilterInternal (..))


Si desea establecer encabezados para el controlador, puede usar la anotación @ModelAttribute .

@ModelAttribute public void setVaryResponseHeader(HttpServletResponse response) { response.setHeader("Vary", "Accept"); }


También me enfrento a este problema y he agregado este problema de código corregido.

public static HttpServletResponse getResponse(HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setCharacterEncoding("UTF-8"); response.setHeader("Access-Control-Allow-Methods", "POST, GET"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); return response; }


WebContentInterceptor no tiene una propiedad llamada Access-Control-Allow-Origin , y hasta donde puedo ver, no expone ningún método para establecer encabezados de respuesta. Solo establece algunos encabezados relacionados con la memoria caché al habilitar / deshabilitar algunas propiedades. Pero es trivial escribir su propio interceptor (o filtro de servlet) que hace esto.