java - 尝试使用 CORS 时出现 403(禁止访问)

标签 java ruby-on-rails angularjs spring spring-mvc

我有一个 Spring websocket 应用程序,我想从另一个客户端访问它。

我正在使用 sockjs 来执行此操作。

连接到http://localhost:8080/hello/info时试图打开时,出现 403 (forbidden) 错误。

这是我在 Spring 中的 CORS conf:

@Component
public class SimpleCORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD, PATCH");
        response.setHeader("Access-Control-Allow-Headers",
                        "Origin, Content-Type, Accept, Cookie, Connection, Accept-Encoding, Accept-Language, Content-Length, Host, Referer, User-Agent");

        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

如果我尝试使用 Spring 自身服务器页面中的套接字,它可以正常工作。但是,当我从另一个使用我在 Spring 中使用的相同 Angular 代码的客户端执行此操作时,它会失败并出现上述错误。

这里是请求头的比较:

工作标题:

GET /hello/info HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36
Accept: */*
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: et-EE,et;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: remember_token=Q9M8fpJa13SsrXJOUDwVAg; _test1_session=N0wvOWV5cTU3VWd2TEs0SnZ2RkVqQ0lzN2tkbndzWmlodVl0VVl5eFdsR1FvYURKMEV0cFFsU2RpK2ZiVTF6ZHZLdFJnSUY0Ukl1Nloxd29QQlNFTmFBT2ZjbVA4M1ZzUEZubDZHSWFRTjhidVlTa3JoZE9MbEhBRGg5SmhmandRWkxNSXQ1cXFLb3ZRTXFLLzZGZGp3PT0tLXZ3czlJLzZxUjloR0EwcHlrdVVwc2c9PQ%3D%3D--c152b026e7859d5e8a5e8f260b66b33a6921f3b7; _harjutus_session=eVlEeU1nWjc4QjZhM0M4bEZQQ0FtVEp6UnFCYVkzUld1bVNDMVpTK1M2SmVjMEpQZlBSWWQ0YUxLczNZeGs5cGVJbWMybWxpN0lzKzBlRGJsR1JCVnQyN21ZWWZLMDJpZU1ENHE2VlJUcVFSdnU1aUVNOUpCOW5Cdyt2QSt0K2JrcHIzME56ZURlbTBtYmlTSlozcWpYY1FLMVlhMlVFWEp3WExNUHA1azdkWFpBY3NxQnJYeC90ZTJzR0NFa2VpYnNRcnp3c0ZOTVVmUDU4N2I4Zy92SHJMTDludVJYTkJtU3E2T0lGUFUwcEQrREtUUmtsdGdkWXVRR2lvN3pXMi0tTVB3WFB2M0NURDQvZlFwbm5UWEZqUT09--5e23d496aa3ecad4f5e7343ba8e326f18304844b

标题不工作:

GET /hello/info HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36
Accept: */*
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: et-EE,et;q=0.8,en-US;q=0.6,en;q=0.4

cookie 头有问题吗?

我对有问题的客户端执行了此操作,但没有任何改变。但这也无关紧要,因为我的 Spring 应用程序和 Ruby on Rails 应用程序都具有完全相同的用于连接到 websocket 的 Angular 代码。

app.config([
    '$httpProvider', function($httpProvider) {

        $httpProvider.defaults.withCredentials = true;

    }
]);

编辑:在浏览器中访问 websocket URL 显示:{"entropy":-319177751,"origins":["*:*"],"cookie_needed":true,"websocket":true}

能否以某种方式关闭 cookie_needed?我在 Spring 文档中找不到任何相关内容。

最佳答案

您使用的是 websockets,因此如果您拥有最新版本的 Spring,则可能是您没有指定允许的来源。根据文档,21.2.6 Configuring allowed origins ,从 Spring 4.1.5 开始,websockets 默认只允许同源请求。

关于java - 尝试使用 CORS 时出现 403(禁止访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866968/

相关文章:

ruby-on-rails - Rails 如何在 Seeds.rb 中使用 FactoryGirl?

asp.net - .NET 4.5 和 Angular 的单页应用程序项目模板

javascript - 根据 AngularJS 中的父指令,子指令中的“require”

ruby-on-rails - has_one 关联不与包括一起工作

javascript - 选项卡不存储范围变量

java - 有一个专门的锁对象有用吗?

java - 处理月份和日期时出现 ParseException

java - 为什么我的 CardView 不会出现在我的 fragment 中?

java - 对通用对象 Java 的数组列表进行排序

ruby-on-rails - 配置 nginx 以代理 thin 和 Rails ActionCable