Javascript 如何获得头授权
我不知道为什么我不能像在Postman(从服务器返回)中看到的那样从头授权中获取值 我尝试了很多方法,但不知道为什么仍然得到空值 这是我的密码: authentication-service.tsJavascript 如何获得头授权,javascript,spring-boot,angular7,bearer-token,Javascript,Spring Boot,Angular7,Bearer Token,我不知道为什么我不能像在Postman(从服务器返回)中看到的那样从头授权中获取值 我尝试了很多方法,但不知道为什么仍然得到空值 这是我的密码: authentication-service.ts login(u: User): Observable<HttpResponse<Response>> { if ((u.username && u.password)) { this.user.setUsername(u.username); th
login(u: User): Observable<HttpResponse<Response>> {
if ((u.username && u.password)) {
this.user.setUsername(u.username);
this.user.setPassword(u.password);
// @ts-ignore
const request = this.http.post<Response>(this.authUrl, this.user, {observe: 'response'} )
.pipe(
tap((data: any) => {
// @ts-ignore
this.log(`Succès ${data.status} authentification succès`, 'success');
this.navigateToCollection();
console.log('data');
console.log(data);
console.log('data.headers.get(Authorization)');
console.log(data.headers.get('Authorization'));
return localStorage.setItem(TOKEN_KEY, data.headers.get('Authorization'));
}),
catchError(this.handleError<any>('login',
console.log('je passe ici3')))
);
request.subscribe(value => {
// console.log(value.headers.get('Authorization'));
console.log(localStorage.getItem(TOKEN_KEY));
});
this.presentLoading(request);
console.log('je passe ici4');
return request;
} else {
this.log('Renseignez les champs', 'error');
alert('Erreur de login ou de mot de passe');
}
登录(u:用户):可观察{
如果((u.username和u.password)){
this.user.setUsername(u.username);
this.user.setPassword(u.password);
//@ts忽略
const request=this.http.post(this.authUrl,this.user,{observe:'response'})
.烟斗(
点击((数据:任意)=>{
//@ts忽略
这个.log(`success${data.status}authentication success`,success');
这个.navigateToCollection();
console.log(“数据”);
控制台日志(数据);
console.log('data.headers.get(Authorization)');
log(data.headers.get('Authorization');
返回localStorage.setItem(TOKEN_KEY,data.headers.get('Authorization');
}),
catchError(this.handleError('login'),
console.log('je passe ici3'))
);
请求。订阅(值=>{
//log(value.headers.get('Authorization');
log(localStorage.getItem(TOKEN_KEY));
});
本文件。当前加载(请求);
控制台日志('je passe ici4');
返回请求;
}否则{
this.log('Renseignez les champs','error');
警报('Erreur de login ou de mot de passe');
}
}
我的令牌由我的服务身份验证(spring boot)发送,如果您需要更多信息,请询问我
我想知道如何获得这个标题值
感谢您抽出时间。您必须从后端(服务器)公开标题或将其传递到响应正文中 访问控制暴露头:headerName; 在springBoot应用程序中添加以下代码:
response.setHeader("Access-Control-Expose-Headers", "Authorization");
否则,您将获得空值,但您将能够在POSTMAN中看到它。我解决了我的问题,我正在使用gateway,但您可以将其放在“配置”方法下面
您无法从数据中获取授权标头。
数据
和标头
在两个不同的对象中可用。“授权标头在响应中不是标准的,因此服务器必须显式通知以公开它。为此,服务器必须添加以下标头:访问控制公开标头:授权”来源:或者您可能必须在服务器端执行此操作:response.addHeader(“访问控制公开头”,“授权”)代码>您是否向其他域发出请求?如果是,则是CORS请求,您必须在响应中添加上述标题。此答案与评论中提到的解决方案有何不同?您好,我正在编辑答案。没有看到您已经添加了评论。:)在返回响应之前,在控制器类中添加上述行。或使用ResponseEntity。你可以参考这个链接解决了,我改变了我的CORS过滤器的现代方法建立在这里:它现在工作
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET","POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(Arrays.asList("authorization", "content-type"));
configuration.setExposedHeaders(Arrays.asList("authorization"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}