Angular 2,Spring Security:跨源 POST 不会发送 cookie

Posted

技术标签:

【中文标题】Angular 2,Spring Security:跨源 POST 不会发送 cookie【英文标题】:Angular 2, Spring Security: Cross origin POST won't send cookiens 【发布时间】: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不发送为什么???

感谢您的任何建议。

【问题讨论】:

【参考方案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);
    

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

【讨论】:

以上是关于Angular 2,Spring Security:跨源 POST 不会发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2,Spring Security:跨源 POST 不会发送 cookie

Angular 2 + CORS + 带有 Spring Security 的 Spring Boot Rest Controller

带有 Spring Security 的 Angular 2 应用程序并从 Spring REST 服务中获取数据

Spring Security 的 POST 响应标头中未设置 Angular 2 CSRF cookie

无法使用 curl 通过 tut-spring-security-and-angular-js “pairs-oauth2” 示例调用资源

Spring Boot 2 和 Security With JWT 无法提供 Angular 构建的静态内容