花了2天的时间来查看为什么当我重新加载页面时丢失了令牌和当前用户的情况下会话存储变为null的原因,即使我将uri设置为/ login退出会话,花了很多时间在Google上搜索,也没有知道该怎么做...
以下是UserService的方式:
..
export class UserService {
private currentUserSubject: BehaviorSubject<JwtResponse>;
public currentUser: Observable<JwtResponse>;
public nameTerms = new Subject<string>();
public name$ = this.nameTerms.asObservable();
constructor(private http: HttpClient,
private cookieService: CookieService)
{
const memo = localStorage.getItem('currentUser');
this.currentUserSubject = new BehaviorSubject<JwtResponse>(JSON.parse(memo));
this.currentUser = this.currentUserSubject.asObservable();
cookieService.set('currentUser', memo);
}
get currentUserValue() {
return this.currentUserSubject.value;
}
login(loginForm): Observable<JwtResponse> {
const url = `${apiUrl}/login`;
return this.http.post<JwtResponse>(url, loginForm).pipe(
tap(user => {
if (user && user.token) {
this.cookieService.set('currentUser', JSON.stringify(user));
if (loginForm.remembered) {
localStorage.setItem('currentUser', JSON.stringify(user));
}
this.nameTerms.next(user.name);
this.currentUserSubject.next(user);
return user;
}
}),
...............
);
}
这是auth-guard本身:
export class AuthGuard implements CanActivate {
constructor(
private router: Router,
private userService: UserService
) {
}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
const currentUser = this.userService.currentUserValue;
if (currentUser) {
// check if route is restricted by role
if (route.data.roles && route.data.roles.indexOf(currentUser.role) === -1) {
console.log(currentUser.role + "fail in " + route.data.roles);
// role not authorised so redirect to home page
this.router.navigate(['/']);
return false;
}
// authorised so return true
return true;
}
console.log("Need log in");
// not logged in so redirect to login page with the return url{queryParams: {returnUrl: state.url}}
this.router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
return false;
}
}
这是我的app.componenet
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'shop';
}
答案 0 :(得分:1)
检查sessionStorage和localStorage的工作方式,这是有关它的文章:
https://alligator.io/js/introduction-localstorage-sessionstorage/
我们将需要查看cookieService的工作方式,并检查会话中代码的哪一部分,会话是否在应用程序组件中,或者是登陆中的第一个组件