为withCredentials指定CORS标头:true

时间:2018-05-09 00:01:12

标签: java spring-security cors angular5

我需要指定CORS标头因为我需要在每个请求中发送cookie密钥。我在不同的服务器上有一个带有Angular 5的Java Spring Boot和UI的后端。

在UI端,我使用下一个TS代码调用服务器:

@Injectable()
export class CoreApi {
  private baseUrl = 'http://localhost:8080/rest/';

  constructor(public http: HttpClient) {
  }

  public get(url: string = ''): Observable<any> {
    return this.http.get(this.getUrl(url), { withCredentials: true });
  }

  public post(url: string, data: any = {}): Observable < any > {
    return this.http.post(this.getUrl(url), data, { withCredentials: true });
  }

  private getUrl(url: string = ''): string {
    return this.baseUrl + url;
  }
}

我需要withCredentials: true来发送cookie,否则Spring Security无法识别没有会话ID的用户。但是在服务器上,我将response.setHeader("Access-Control-Allow-Origin", "*")用于UI和后端的两个不同服务器的可能性工作。

我陷入了恶性循环:如果我删除Access-Control-Allow-Origin - *,我会得到:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

如果我删除withCredentials: true没有会话ID,Spring Security无法正常工作。并且所有请求在验证后 - UNAUTHORIZED没有cookie。

我认为需要实现原始白名单,并在涉及凭据时响应具有有效来源的CORS请求。但这怎么办? 如果你知道这件事,请告诉我。谢谢!

可以过滤这样的内容:

@WebFilter(urlPatterns = {"/*" })
public class CorsRestFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        ...somehow sfecifying Access-Control-Allow-Origin...
        response.setHeader("Access-Control-Allow-Methods", "POST, GET");
        chain.doFilter(req, res);
    }
}

2 个答案:

答案 0 :(得分:1)

创建常量服务组件并将其注入服务方法调用中 例如:

service.ts

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
  withCredentials: true,
};



demoServiceMethod(requestparameter): Observable<PayloadResponse<any>> {
    return this.http.post<PayloadResponse<any>>(environment.baseurl +
      'v1/test/api', requestparameter, httpOptions)
      .pipe(catchError(this.apiErrorService.handleError<PayloadResponse<any>>('operation name  ')));
  }

答案 1 :(得分:0)

您还需要添加Access-Control-Allow-Origin标题。

response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

如果您使用凭据进行跨源调用,则需要添加显式主机,而不是*。否则,您的通话将被浏览器阻止。

-

如果您使用的是弹簧,也可以使用他们的crossorigin标签: https://spring.io/guides/gs/rest-service-cors/