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 POST 上 SESSIONID 在 不发送。 为什么???感谢您的任何建议。
【问题讨论】:
【参考方案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” 示例调用资源