Мне нужно указать заголовки CORS, потому что мне нужно отправлять ключ cookie в каждом запросе. У меня есть бэкэнд с Java Spring Boot и пользовательский интерфейс с Angular 5 на разных серверах.
На стороне интерфейса я вызываю сервер со следующим кодом 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 не сможет распознать пользователя без идентификатора сеанса. Но на сервере я поставил response.setHeader("Access-Control-Allow-Origin", "*")
для возможности работы с двумя разными серверами для пользовательского интерфейса и бэкэнда.
И я в порочном круге: если я удаляю 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
Spring Security не работает правильно без идентификатора сеанса. И все запросы после аутентификации - UNAUTHORIZED
без куки.
Я думаю, что нужно реализовать белый список происхождения и отвечать на запросы 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);
}
}