From 2084f33a8c4d0d0931e92f6e0b88373ba667c157 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de> Date: Fri, 25 Apr 2014 11:26:36 +0200 Subject: [PATCH] Added Filter to add CORS headers --- .../java/de/thm/arsnova/web/CorsFilter.java | 29 ++++++ .../webapp/WEB-INF/spring/arsnova-servlet.xml | 91 ++++++++++--------- src/main/webapp/WEB-INF/web.xml | 9 ++ 3 files changed, 87 insertions(+), 42 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/web/CorsFilter.java diff --git a/src/main/java/de/thm/arsnova/web/CorsFilter.java b/src/main/java/de/thm/arsnova/web/CorsFilter.java new file mode 100644 index 00000000..fc2e55f3 --- /dev/null +++ b/src/main/java/de/thm/arsnova/web/CorsFilter.java @@ -0,0 +1,29 @@ +package de.thm.arsnova.web; + +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.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +@Component +public class CorsFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + response.addHeader("Access-Control-Allow-Credentials", "true"); + response.addHeader("Access-Control-Allow-Methods", "GET"); + response.addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); + + if (request.getHeader("origin") != null) { + response.addHeader("Access-Control-Allow-Origin", request.getHeader("origin")); + } + + filterChain.doFilter(request, response); + } +} diff --git a/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml b/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml index e0e455c0..37dc92f7 100644 --- a/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml +++ b/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml @@ -1,64 +1,71 @@ <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:aop="http://www.springframework.org/schema/aop" - xmlns:mvc="http://www.springframework.org/schema/mvc" - xmlns:context="http://www.springframework.org/schema/context" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" + xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <!-- ARSnova Servlet Context --> - - <context:component-scan base-package="de.thm.arsnova.controller" /> - <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> - - <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> - <property name="favorPathExtension" value="false" /> - <property name="favorParameter" value="true" /> - <property name="mediaTypes" > - <value> - html=text/html - json=application/json - </value> - </property> + + <context:component-scan base-package="de.thm.arsnova.controller,de.thm.arsnova.web" /> + <mvc:annotation-driven + content-negotiation-manager="contentNegotiationManager" /> + + <bean id="contentNegotiationManager" + class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> + <property name="favorPathExtension" value="false" /> + <property name="favorParameter" value="true" /> + <property name="mediaTypes"> + <value> + html=text/html + json=application/json + </value> + </property> </bean> <mvc:annotation-driven /> <mvc:resources mapping="/**" location="/" /> - + <!-- --> - <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> - <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> + <bean + class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> + <bean + class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> - <bean class = "org.springframework.http.converter.StringHttpMessageConverter"> - <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" /> - </bean> - <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> + <bean + class="org.springframework.http.converter.StringHttpMessageConverter"> + <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" /> + </bean> + <bean + class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> </list> </property> </bean> <!-- --> - <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> - <property name="viewResolvers"> - <list> - <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> - <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> - <property name="prefix" value="/WEB-INF/jsp/"/> - <property name="suffix" value=".jsp"/> - </bean> - </list> - </property> - <property name="defaultViews"> - <list> - <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> - <property name="prefixJson" value="false"/> - </bean> - </list> - </property> + <bean + class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> + <property name="viewResolvers"> + <list> + <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> + <property name="viewClass" + value="org.springframework.web.servlet.view.JstlView" /> + <property name="prefix" value="/WEB-INF/jsp/" /> + <property name="suffix" value=".jsp" /> + </bean> + </list> + </property> + <property name="defaultViews"> + <list> + <bean + class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> + <property name="prefixJson" value="false" /> + </bean> + </list> + </property> </bean> - + </beans> diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 8ebba29f..75b4f85d 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -58,6 +58,15 @@ <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> + <filter> + <filter-name>corsFilter</filter-name> + <filter-class>de.thm.arsnova.web.CorsFilter</filter-class> + </filter> + <filter-mapping> + <filter-name>corsFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <mime-mapping> <extension>manifest</extension> <mime-type>text/cache-manifest</mime-type> -- GitLab