SimpleCORSFilter无效

时间:2015-08-19 01:05:33

标签: ajax spring

我使用Spring Rest作为我的后端,当我通过$ .ajax {}发送请求时,我收到了错误消息:

  

XMLHttpRequest无法加载http://121.40.249.129:8080/user/login。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' http://127.0.0.1:8000'因此不允许访问。

所以,我在Spring Project中添加了SimpleCORSFilter

SimpleCORSFilter:

@Component
public class SimpleCORSFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version");
        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}
}

因为我没有web.xml,所以我没有将代码添加到web.xml:



<filter>
    <filter-name>simpleCORSFilter</filter-name>
    <filter-class>xxx.xxx.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>simpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
&#13;
&#13;
&#13;

所以,我仍然得到错误,我该如何修复它。

1 个答案:

答案 0 :(得分:1)

根据我的经验,当*设置为Access-Control-Allow-Origin时,Access-Control-Allow-Credentials无法为true工作。

所以,你应该有

response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8000");

实际上,您可以将其作为属性,而不是对网址进行硬编码。如果您想允许多个来源,this answer会有所帮助。

此外:

  1. 建议使用@Order(Ordered.HIGHEST_PRECEDENCE)为该课程添加注释,因为此过滤器应首先出现。
  2. 如果您使用的是CSRF,还应将相应的标题添加到Access-Control-Allow-Headers的列表中。
  3. <强>更新

    正如 @RTzhong 所做的那样(请参阅下面的评论),将*替换为request.getHeader("Origin")似乎是理想的解决方法。但是,更好的安全措施通常是指定实际网址或第一个checking with a whitelist,除非必须公开将其API公开给未知网站。

    有关具体示例,请参阅Spring Lemon的源代码。