【问题标题】:Angular 2, Spring Security: Cross origin POST won't send cookiensAngular 2,Spring Security:跨源 POST 不会发送 cookie
【发布时间】:2017-08-06 06:13:28
【问题描述】:

您好,我有以下应用:

  • 前端在 Angular 2 中运行在 localhost:4200

  • Backened 在 Spring 中运行在 localhost:8080

我正在使用 Spring Security。在服务器站点上,我有 CORSFilter

response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Allow-Credentials", "true");
filterChain.doFilter(request, response);

这是客户网站:

private static headers: Headers = new Headers({ 'Content-Type': 'application/json' });
private static postOptions: RequestOptions = new RequestOptions({ headers: SecureHttpService.headers });
private static getOptions: RequestOptions = new RequestOptions({});


constructor(private http: Http) {
     SecureHttpService.postOptions.withCredentials = true;
     SecureHttpService.getOptions.withCredentials = true;
}

public get(url: string): Observable<Response> {
    return this.http.get(url, SecureHttpService.getOptions);
}

public post(url: string, data: any): Observable<Response> {
    return this.http.post(url, data, SecureHttpService.postOptions);
}

如你所见,我设置了 withCredentials = true;

这是我的问题:

  • HTTP GET 上发送 SESSIONID

  • HTTP POSTSESSIONID不发送为什么???

感谢您的任何建议。

【问题讨论】:

    标签: http angular cookies spring-security


    【解决方案1】:

    这是我的解决方案:

    基于阅读这个伟大的article,预检请求的工作方式如下:

    “浏览器首先使用与目标请求相同的 URL 执行一个 OPTIONS 请求,以检查它是否有权执行该请求。此 OPTIONS 请求返回标明可以对 URL 执行什么操作的标头。如果权限匹配,则浏览器执行请求。”

    所以我向 Spring 添加了过滤器,它将通过所有 OPTIONS 请求。

    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
        String httpmethod = request.getMethod();
    
        if(httpmethod.equals("OPTIONS")) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            filterChain.doFilter(request, response);
        }
    }
    

    !请注意,我将此解决方案仅用于开发。

    【讨论】:

      猜你喜欢
      • 2017-08-21
      • 2016-02-25
      • 1970-01-01
      • 2013-01-05
      • 2014-11-03
      • 2021-03-05
      • 2022-11-26
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多