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

时间:2018-08-22 00:42:15

标签: java spring google-chrome cors

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

  

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

我的堆栈很简单。我在Tomcat中使用Java Spring。在前端,我使用jquery进行请求。

我没有从Spring看到任何与此相关的日志,也没有在java spring应用程序的调试器中显示的线程中看到任何动作(这使得调试在被阻止的地方真的很难)。

就我的spring资源类而言,Ive在类的顶部包括了交叉原点注释(@CrossOrigin())。 Ive还尝试将相同的注释也放置在资源的方法上(没有任何运气)。从长远来看,我还尝试在新的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请求时,没有看到与允许所有或任何相关的任何标头具体来历。这使我想知道注释是否被某些东西阻止了。

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

2 个答案:

答案 0 :(得分: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() {
}

}

答案 1 :(得分:0)

有一种更简单的验证方法。您可以使用postman或打开F12开发人员工具来查看请求的响应主体(非CORS的请求)。如果Response标头包含access-control-allow-origin:*,则表示设置成功,然后检查是否存在OPTION请求,因为浏览器不会直接请求该请求,而是会发送OPTION请求以查看网站是否支持CORS。如果确实发送了OPTION请求,则该请求的响应代码不是200,则将导致CORS失败,因此您只需要正确响应此OPTION请求即可。