我正在使用Spring-MVC构建一个Angular2应用程序。我在Spring Security中添加了身份验证,当我用邮递员查询我的REST服务器时,一切都很好。当我在Angular2中将Authorization
添加到我的标题时,我收到401错误。
错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401
我的Angular2服务:
@Injectable()
export class BookService {
headers = new Headers();
options = new RequestOptions({ headers: this.headers });
constructor(
private http: Http) {
this.headers.append('Content-Type', 'application/json');
this.headers.append('Authorization', 'Basic ' + btoa('nirgn:password'));
}
getBooksByCategory(categoryId: number) {
return this.http.get(environment.baseUrl + 'categories/' + categoryId + '/books', this.options)
.map((res: Response) => <Book[]>res.json()._embedded.books)
.catch(this.handleError);
}
}
在春天,我允许这样的所有来源:response.addHeader("Access-Control-Allow-Origin", "*");
(在CORSFilter implements Filter
类中)。
另外,我添加了这样的身份验证:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests().anyRequest().authenticated();
}
当我删除.and().authorizeRequests().anyRequest().authenticated()
时,我没有收到任何错误,并且能够GET
来自服务器的数据。
所以,总而言之,我很确定它不是Access-Control-Allow-Origin
而且是因为服务器没有得到我的授权标头。当我尝试在postman中查询服务器时,没有auth我也得到401,但是当我添加Basic auth时我得到200.
我还检查邮递员和angualr2中密码的输出,以确保angualr2输出中'Basic ' + btoa('nirgn:password')
输出的密码与邮递员相同,并且它是相同的。这里是:
答案 0 :(得分:1)
所以我设法搞清楚了。毕竟这是CORS(春天)。
我必须告诉我的configure
班级使用我创建的CORSFilter
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests().anyRequest().authenticated()
.and().addFilterAfter(new CORSFilter(), CsrfFilter.class);
}
奇怪的是,我仍然不明白为什么邮递员成功并且在浏览器中(有角度)我得到了错误。