【发布时间】:2018-12-04 03:38:33
【问题描述】:
我正在尝试找出一种方法来保持我的角度变量与页面刷新/跨组件。我的工作流程是
- 用户通过凭据(用户名和密码)登录并获取访问令牌
- 每个请求都将使用用户访问令牌
通过我的应用程序可以正常工作。当用户登录并获取访问令牌并将此令牌保存在本地存储中。并且应用程序将用户重定向到仪表板组件。
但问题是,如果我刷新页面,localstorage 会变为空白,应用程序会再次将用户重定向到登录页面。
我对 Angular 很陌生,无法找到在页面刷新后保留我的数据的方法,非常感谢任何帮助。
dashboard.component.ts
auth.service.ts
jwt.interceptor.ts
auth.service.ts
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Signin, ResetPassword } from '../model/user.model';
import { Router } from '@angular/router';
@Injectable()
export class AuthService {
private URL_Register = 'http://localhost:52718/account/register'; //Register User (Working)
private URL_Signin = 'http://localhost:52718/account/Signin'; // Login User (Working)
private URL_Token = 'http://localhost:52718/connect/token'; // Get Token Against Register User (Working)
private URL_Data = 'http://localhost:52718/api/values'; // Get Token Against Register User (Working)
private URL_Claims = 'http://localhost:52718/account/Get';
private URL_PasswordRecovery = 'http://localhost:52718/account/ForgotPassword';
private URL_ChangePassword = 'http://localhost:52718/account/ChangePassword';
public isUserAuthenticated: boolean = false;
private loggedIn = new BehaviorSubject<boolean>(false); // {1}
get isLoggedIn() {
return this.loggedIn.asObservable(); // {2}
}
constructor(
private http: HttpClient,
private router: Router) { }
userAuthentication(credientials: Signin) {
let reqHeader = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.post(this.URL_Signin, JSON.stringify(credientials), { headers: reqHeader }).subscribe((data: any) => {
localStorage.setItem('userToken', data.token);
this.loggedIn.next(true);
this.router.navigate(['/dashboard']);
},
(err: HttpErrorResponse) => {
console.log('Auth Service (Method userAuthentication): [HttpError] ' + err.message)
});
}
fetchData() {
return this.http.get(this.URL_Data);
}
getUserClaims() {
return this.http.get(this.URL_Claims);
}
logout() {
// remove user from local storage to log user out
localStorage.removeItem('userToken');
this.loggedIn.next(false);
this.router.navigate(['/login']);
}
forgotPassword(ResetPassword: ResetPassword) {
let reqHeader = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.post(this.URL_PasswordRecovery, JSON.stringify(ResetPassword), { headers: reqHeader }).subscribe((data: any) => { },
(err: HttpErrorResponse) => {
console.log('Auth Service (Method userAuthentication): [HttpError] ' + err)
});;
}
changePassword(QueryParams: Object) {
let reqHeader = new HttpHeaders({ 'Content-Type': 'application/json' });
return this.http.put(this.URL_ChangePassword, JSON.stringify(QueryParams), { headers: reqHeader }).subscribe((data: any) => {
localStorage.setItem('userToken', data.token);
this.loggedIn.next(true);
this.router.navigate(['/dashboard']);
},
(err: HttpErrorResponse) => {
console.log('Auth Service (Method changePassword): [HttpError] ' + err)
});;
}
}
【问题讨论】:
-
你确定你没有在其他地方调用 logout() 或使用 localStorage.removeItem('userToken') 吗?
-
是的,我确定。我发现我的问题在这里
return this.loggedIn.asObservable();当我刷新我的仪表板页面然后默认登录设置为 false 这就是为什么我每次刷新页面时都会注销。所以我将登录的get属性更新为get isLoggedIn() { let currentUser = localStorage.getItem('userToken'); if (!currentUser) { } this.loggedIn.next(true); return this.loggedIn.asObservable(); // {2} },发现现在我的问题已经解决了。 -
@Powkachu 如果您有更好的答案,请发布。
标签: angular