【发布时间】:2016-12-07 11:06:33
【问题描述】:
我尝试了几种方法来设置 CORS 标头:
- 添加我自己的 servlet 过滤器
- 使用 com.thetransactioncompany.cors-filer
- 使用 Springs WebMvcConfigurer Bean
没用!!!
谁能帮帮我。这里是第一种方法...
web.xml
<!-- Spring Container -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>de.hotelonlineportal.config.AppConfig</param-value>
</context-param>
<!-- Device Detection -->
<filter>
<filter-name>deviceResolverRequestFilter</filter-name>
<filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
</filter>
<!-- Rest Dispatcher -->
<servlet>
<servlet-name>rest-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest-dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<!-- CORS Filter -->
<filter>
<filter-name>cors-filter</filter-name>
<filter-class>de.hotelonlineportal.security.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CORSFilter.java
public class CORSFilter implements Filter {
private static Logger logger = LogManager.getLogger(CORSFilter.class);
public CORSFilter() {
logger.info("SimpleCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
如果调用 HTTP 请求,过滤器已成功应用,但响应仍然不包含任何 Access-Control* 标头。
Chrome 调试器在控制台中显示这个:
XMLHttpRequest 无法加载 http://localhost:8080/hop-backend/rest/shop/listHotelsLandingPage。不 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://localhost:9000” 使用权。响应的 HTTP 状态代码为 500。
【问题讨论】:
-
如果你记录 request.getHeader("Origin"),有什么吗?出于调试目的,您是否尝试将标头 Access-Control-Allow-Origin 设置为 *?
-
检查您的服务器日志。
-
request.getHeader("Origin") 显示localhost:9000。我还尝试了通配符 *.
-
我试图调用的其余 web 服务有问题并引发异常。有趣的是,只有在此服务调用中,才会在 HTTP 响应中设置 CORS 信息。修复其余服务后,正确设置了 cors 标头。为什么会发生这种情况?
-
由于使用代理的延迟获取,在 Jackson API 的 un-/marshalling 期间似乎发生了异常。但我仍然不明白为什么这会对 HTTP 标头产生影响。无法写入内容:无法初始化代理 - 无会话(通过引用链:java.util.ArrayList[0]->de.hotelonlineportal.entity.Hotel["provider"]->de.hotelonlineportal.entity.Provider_$$ _jvst6de_2["id"]);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - no Session (through reference chain...
标签: angularjs spring spring-mvc