Angular 5 HttpInterceptor 并在 header 中发送授权令牌
Angular 5 HttpInterceptor and sending Authorization Token in header
我的流程是登录页面->首页。
登录页面没有令牌,登录后,服务器提供令牌,用户被重定向到首页。
首页发送token到服务器,token校验通过,服务器回传数据显示在前端。
问题:
HttpInterceptor 在登录请求时触发 Cannot read property 'token' of null
。我想让拦截器以某种方式忽略登录 api 请求,并且仅在令牌存在时才拦截后续调用。
你好,你可以在你的 header 中设置一个键值来区分登录和其他请求,并创建一个拦截器来检查该键是否存在以删除令牌
import { HttpClient, HttpHeaders } from '@angular/common/http';
...
login(username, password) {
let headers = new HttpHeaders();
headers = headers.append('noToken', 'noToken');
return this.http.post(loginUrl, data, {headers: headers})
...
}
然后创建拦截器
export class TokenInterceptor implements HttpInterceptor {
constructor() {}
intercept(httpReq: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
let headers = httpReq.headers
.set('Content-Type', 'application/json');
if (headers.get('noToken') === 'noToken') {
headers = headers.delete('Authorization').delete('noToken');
}
const newReq = httpReq.clone({headers: headers});
return next.handle(newReq);
}
}
并将其添加到您的应用程序模块提供商
import { TokenInterceptor } from './token.interceptor';
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
}
]
工作解决方案
auth.interceptor.ts
export class AuthInterceptor implements HttpInterceptor {
constructor(public auth: HouseaccountsService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(req.headers.get('notoken') !== 'noToken') {
req = req.clone({
setHeaders: {
Authorization: JSON.parse(localStorage.getItem('currentUser')).token
}
});
}
return next.handle(req);
}
}
service.ts
login(user) {
let loginHeaders = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'noToken': 'noToken'
})
}
return this.http.post<any>(this.url + '/login', JSON.stringify(user), loginHeaders);
}
我的流程是登录页面->首页。
登录页面没有令牌,登录后,服务器提供令牌,用户被重定向到首页。
首页发送token到服务器,token校验通过,服务器回传数据显示在前端。
问题:
HttpInterceptor 在登录请求时触发 Cannot read property 'token' of null
。我想让拦截器以某种方式忽略登录 api 请求,并且仅在令牌存在时才拦截后续调用。
你好,你可以在你的 header 中设置一个键值来区分登录和其他请求,并创建一个拦截器来检查该键是否存在以删除令牌
import { HttpClient, HttpHeaders } from '@angular/common/http';
...
login(username, password) {
let headers = new HttpHeaders();
headers = headers.append('noToken', 'noToken');
return this.http.post(loginUrl, data, {headers: headers})
...
}
然后创建拦截器
export class TokenInterceptor implements HttpInterceptor {
constructor() {}
intercept(httpReq: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
let headers = httpReq.headers
.set('Content-Type', 'application/json');
if (headers.get('noToken') === 'noToken') {
headers = headers.delete('Authorization').delete('noToken');
}
const newReq = httpReq.clone({headers: headers});
return next.handle(newReq);
}
}
并将其添加到您的应用程序模块提供商
import { TokenInterceptor } from './token.interceptor';
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
}
]
工作解决方案
auth.interceptor.ts
export class AuthInterceptor implements HttpInterceptor {
constructor(public auth: HouseaccountsService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(req.headers.get('notoken') !== 'noToken') {
req = req.clone({
setHeaders: {
Authorization: JSON.parse(localStorage.getItem('currentUser')).token
}
});
}
return next.handle(req);
}
}
service.ts
login(user) {
let loginHeaders = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'noToken': 'noToken'
})
}
return this.http.post<any>(this.url + '/login', JSON.stringify(user), loginHeaders);
}