飞镖 CORS 不起作用

Posted

技术标签:

【中文标题】飞镖 CORS 不起作用【英文标题】:Dart CORS doesn't work 【发布时间】:2017-01-31 00:34:55 【问题描述】:

您好,我想向我的 Spring 服务器发出请求。现在,由于 CORS 选项受限,我收到错误消息。 所以我添加了一个过滤器,因为注释不起作用:

@Component
public class CORSFilter implements Filter 

    public CORSFilter() 

    

    @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", "*");
        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(request, response);
    
    @Override
    public void init(FilterConfig filterConfig) 
    
    @Override
    public void destroy() 

    

现在我的问题是,cors 过滤器不适用于 dart 请求。 在正常的浏览器请求中,标头已设置,但在 dart http 请求中未设置。

有什么办法可以解决这个问题吗?

2016 年 9 月 23 日更新: 这是http://pastebin.com/9KNfx7Jd 问题是过滤器不受此 http 调用的影响。 只有当我通过浏览器中的 URL 访问文件时它才有效。

这里有 ajax:

Remote Address:127.0.0.1:8090 Request URL:http://localhost:8090/time/time/login Request Method:OPTIONS Status Code:401 Unauthorized Response Headers view source Cache-Control:no-cache, no-store, max-age=0, must-revalidate Connection:keep-alive Content-Length:114 Content-Type:text/html;charset=UTF-8 Date:Fri, 23 Sep 2016 12:57:55 GMT Expires:0 Pragma:no-cache Server:WildFly/10 Set-Cookie:JSESSIONID=ZIkzLq-iALC6CDx7r6LhPz_8PiD05Q9ufod6GluZ.ccn6dc2; path=/time WWW-Authenticate:Basic realm="Realm" X-Content-Type-Options:nosniff X-Frame-Options:DENY X-Powered-By:Undertow/1 X-XSS-Protection:1; mode=block Request Headers view source Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Access-Control-Request-Headers:content-type Access-Control-Request-Method:GET Connection:keep-alive Host:localhost:8090 Origin:http://localhost:8080 Referer:http://localhost:8080/ User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.104 (Dart) Safari/537.36

这里没有:

Remote Address:127.0.0.1:8090 Request URL:http://localhost:8090/time/time/login Request Method:GET Status Code:200 OK Response Headers view source Access-Control-Allow-Origin:* Cache-Control:no-cache, no-store, max-age=0, must-revalidate Connection:keep-alive Content-Length:5 Content-Type:text/html;charset=ISO-8859-1 Date:Fri, 23 Sep 2016 13:10:36 GMT Expires:0 Pragma:no-cache Server:WildFly/10 Set-Cookie:JSESSIONID=nQFjGB2m7ovHVT9VUnhtCJSXZvEZV4WWH0YCrgFk.ccn6dc2; path=/time X-Content-Type-Options:nosniff X-Frame-Options:DENY X-Powered-By:Undertow/1 X-XSS-Protection:1; mode=block Request Headers view source Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Authorization:Basic c2tvYmxlcjpTMW1vbjUyNzli Cache-Control:max-age=0 Connection:keep-alive Cookie:JSESSIONID=oHJ4GvQ8pFNv8HSujI49NRXQxoVSVMM580sSrvJW.ccn6dc2 Host:localhost:8090 Upgrade-Insecure-Requests:1 User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.104 (Dart) Safari/537.36

编辑 26.09.2016:

好的,我现在将我的 SecurityConfig 更改为:

@Override protected void configure(final HttpSecurity http) throws Exception super.configure(http); http.addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class); http.authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll(); http.authorizeRequests().antMatchers("/**").authenticated(); 现在过滤器正在调用,但我现在收到一个新错误:Response for preflight has invalid HTTP status code 401

标题: Access-Control-Allow-Origin:* Cache-Control:no-cache, no-store, max-age=0, must-revalidate Connection:keep-alive Content-Length:114 Content-Type:text/html;charset=UTF-8 Date:Mon, 26 Sep 2016 12:30:39 GMT

【问题讨论】:

“飞镖请求”是什么意思?您的意思是在从 dart 代码触发的请求中,标头不存在于对请求的响应中? 是的,我就是这个意思 如果这里没有提供任何信息,实际上不可能看到可能出现的问题。您的 dart 应用程序的一些代码和失败的示例 HTTP 请求的转储将是一个开始。 link这里是http调用函数的链接 【参考方案1】:

好的,我解决了禁用铬的网络安全问题。 感谢大家帮助我:)

【讨论】:

【参考方案2】:

您的过滤器似乎不适用于 OPTIONS 请求。 对此博文的评论表明需要明确启用OPTIONS 请求:

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

我在使用带有 Spring MVC 的 CORS(使用 Filter 或 HandlerInterceptor 时)和 Spring Security 时发现的一个“问题”是,您需要明确允许所有 OPTIONS 请求以正确处理预飞行。 CORS 的 W3C 规范说飞行前请求不应该发送凭据,但是我发现有些浏览器确实发送了凭据,而其他浏览器则没有。因此,如果您不允许All OPTIONS,如果浏览器未发送凭据,则会收到 403。

预检请求是在使用 Spring Security 时需要专门配置的,还是会在过滤器链之前处理预检?

另见

Disable Spring Security for OPTIONS Http Method Enable CORS for OPTIONS request using Spring Framework How to handle HTTP OPTIONS with Spring MVC? How to handle HTTP OPTIONS requests in Spring Boot? Spring and HTTP Options request

【讨论】:

好吧,我在 SecurityConfig 类中做了以下操作:http.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll(); 但它没有修复错误XMLHttpRequest cannot load http://localhost:8090/time/time/jsontime. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 401. 这解决了你的问题? 抱歉,新行有问题^^。不,它没有:(。我编辑了上面的评论。 我对 Spring 了解不多,但我确信这需要在服务器上而不是在 Dart 端修复(因为 Dart 标签,我偶然发现了你的问题)。跨度> 所以当我禁用安全性时它工作正常。但是由于用户凭据,我必须使用安全性。也许还有另一种解决方法可以解决此问题。

以上是关于飞镖 CORS 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

颤振/飞镖格式化数据到实例不起作用

弹簧靴。 CORS。 'allowCredentials = false' 不起作用

CORS 配置不起作用

带有 Spring 的 CORS 不起作用

带有 XMLHttpRequest 的 CORS 不起作用

AngularJS和rails cors标头不起作用