【问题标题】:Access-Control-Allow-Origin not set in ResponseAccess-Control-Allow-Origin 未在响应中设置
【发布时间】: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


【解决方案1】:

检查您正在使用 tomcat。 尝试使用tomcat-CORSFilter

使用过滤器和初始化参数如下:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<!-- 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2017-07-31
    • 2016-07-21
    相关资源
    最近更新 更多