这是我第一次在我的角度客户端中编写一个Interceptor。 我在Google上关注了几篇文章,以添加HttpInteceptor。我打电话给网络api并获得了令牌。我用控制台日志记录验证了令牌已收到,并将其添加到我的本地存储中。这是我的角度服务代码:
loginUser(user) : Observable<boolean> {
var reqHeader = new HttpHeaders({ 'Content-Type': 'application/x-www-urlencoded','No-Auth':'True' });
return this.http
.post('http://localhost:55009/api/login', user )
.map((data: any) => {
this.token = data.token.token;
localStorage.setItem('userToken', data.token.token);
this.errorMessage = data.token.error;
console.log('token ===> ' + data.token.token);
console.log('isTokenValid ===> ' + this.isTokenValid());
console.log('errorMessage ===> ' + this.errorMessage);
return this.isTokenValid();
})
// .map((response:any) => response.json())
.catch(this.handleError);
}
当我单击其他路线/菜单时,我遍历了interceptor.ts中的代码。当代码调用localStorage.getItem和login.getToken但都返回空字符串时。我检查了在线示例教程,但在我的代码中没有发现任何不同之处:
export class AuthInterceptor implements HttpInterceptor {
public userToken: string;
constructor(private router: Router, public login: LoginService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.userToken = this.login.getToken();
if (req.headers.get('No-Auth') == "True")
return next.handle(req.clone());
if (localStorage.getItem('userToken') != null) {
const clonedreq = req.clone({
headers: req.headers.set("Authorization", "Bearer " + localStorage.getItem('userToken'))
});
return next.handle(clonedreq)
.do(
succ => { },
err => {
if (err.status === 401)
this.router.navigateByUrl('/home');
}
);
}
else {
this.router.navigateByUrl('/home');
}
}
}
答案 0 :(得分:1)
这很奇怪。在角度服务中,我能够获取令牌并使用LocalStorage进行设置。但是,该组件LocalStorage返回null。我将LocalStorage.setItem从服务移至组件,现在可以在Chrome开发工具上看到该值。
答案 1 :(得分:0)
您必须订阅http
请求。
.map((response:any) => response.json())
.subscribe(res => console.log(res))
答案 2 :(得分:0)
首先验证令牌仍在您的本地存储中。您可以通过以下方式在Chrome上执行此操作:
这将告诉您令牌是否仍存在于本地存储中。如果是,那么我建议您在拦截器代码中设置一个断点,以确认加载路由时它是否在正确运行。
答案 3 :(得分:0)
在loginUser方法中尝试以下操作:
this.token = data;
localStorage.setItem('userToken', this.token.token);
相反:
this.token = data.token.token;
localStorage.setItem('userToken', data.token.token);