Java Spring:请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Java Spring:请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:Java Spring: No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2019-01-28 05:15:33 【问题描述】:

我正在尝试破解一个需要 CORS 的项目。当我请求 Java Spring Rest API 时,我收到:

请求的资源上没有“Access-Control-Allow-Origin”标头

我的堆栈非常简单。我正在将 Java Spring 与 Tomcat 一起使用。在前端,我使用 jquery 发出请求。

我没有看到来自 Spring 的任何关于此的日志,也没有看到在 java spring 应用程序的调试器中显示的线程中的任何操作(使得在阻塞的地方很难调试)。

就我的 spring 资源类而言,我在类的顶部包含了跨源注释 (@CrossOrigin())。我还尝试将相同的注释也放在资源的方法上(没有任何运气)。从长远来看,我还尝试在新的 web.xml 文件中放入一些配置,以老式方式配置 CORS 过滤器:

<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>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我想补充的最后一个细节是,当我向前面提到的 API(带有 CORS 注释)发出非 CORS 请求时,我没有看到任何与允许所有或任何相关的标头返回具体产地。这让我想知道注释是否被某些东西阻止了。

我意识到没有太多代码和日志,社区无法真正帮助我。我正在寻求有关如何调试此问题的指导。感谢您的帮助!

【问题讨论】:

【参考方案1】:

春季版本冲突为您造成了这种情况。您可能需要检查版本。如果版本不是问题,请添加这样的类。

@Component
public class MyCORSFilter implements Filter 

@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() 



【讨论】:

完美!谢谢【参考方案2】:

有一种更简单的验证方法。您可以使用postman 或打开 F12 开发者工具查看请求的响应正文(带有非 CORS 的请求)。如果Response header有access-control-allow-origin:*,则说明设置成功,然后查看是否有OPTION请求,因为浏览器不会直接请求请求,而是会发送OPTION请求,看站点是否支持CORS。如果确实发送了OPTION请求,如果这个请求的响应码不是200,就会导致CORS失败,所以只需要正确响应这个OPTION请求即可。

【讨论】:

感谢您的回复!我在邮递员中向应该接受 CORS 的 API 发出了一些请求,但在与“access-control-allow-origin”相关的响应中没有看到任何标头。我已经用新发现更新了我的问题。

以上是关于Java Spring:请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 和 Html:请求的资源上不存在“Access-Control-Allow-Origin”标头

带有 Webflux 的 Spring Boot:请求的资源上不存在“Access-Control-Allow-Origin”标头

Spring 4/5 全局 CORS 配置不起作用,给出“请求的资源上不存在‘Access-Control-Allow-Origin’标头’

请求的资源上不存在“Access-Control-Allow-Origin”标头。离子、AngularJS、Spring Boot 1.3

angular 9 和 spring boot 2 中请求的资源上不存在“Access-Control-Allow-Origin”标头

CORS 策略:请求的资源 Spring Boot Rest API 和 VUE 上不存在“Access-Control-Allow-Origin”标头