[Angular & Web] Retrieve user data from Session
2017-09-04 21:24
246 查看
Once user sign up, we store the user data inside cookie in the broswer and also keep a memory copy in the server.
If next time, user refresh the page, we want to tell that the user is already authed.
Create a endpoint, to retrive the user data:
Router:
SessionStorage:
On the client, once page loaded, we try to get user data first.
If next time, user refresh the page, we want to tell that the user is already authed.
Create a endpoint, to retrive the user data:
app.route('/api/user') .get(getUser);
Router:
import {Request, Response} from 'express'; import {sessionStore} from './session-store'; export function getUser(req: Request, res: Response) { // Get sessionid from cookies const sessionId = req.cookies['SESSIONID']; // get user according to the session id from the session storage const user = sessionStore.findUserBySessionId(sessionId); if (user) { // if there is user, send successful response res.status(200).json(user); } else { // if there is no user, send empty response res.sendStatus(204); } }
SessionStorage:
import {Session} from './session'; import {User} from '../src/app/model/user'; class SessionStore { private sessions: {[key: string]: Session} = {}; createSession(sessionId: string, user: User) { this.sessions[sessionId] = new Session(sessionId, user); } findUserBySessionId(sessionId: string): User | undefined { const session = this.sessions[sessionId]; const isSessionValid = session && session.isValid(); return isSessionValid ? session.user : undefined; } } // We want only global singleton export const sessionStore = new SessionStore();
On the client, once page loaded, we try to get user data first.
import { Injectable } from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs/Observable'; import {User} from '../model/user'; import {BehaviorSubject} from 'rxjs/BehaviorSubject'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/shareReplay'; import 'rxjs/add/operator/filter'; import 'rxjs/add/operator/do'; export const ANONYMOUS_USER: User = { id: undefined, email: '' }; @Injectable() export class AuthService { subject = new BehaviorSubject<User>(undefined); // filter out undefined user user$: Observable<User> = this.subject.asObservable().filter(user => !!user); isLoggedIn$: Observable<boolean> = this.user$.map(user => !!user.id); isLoggedOut$: Observable<boolean> = this.isLoggedIn$.map(isLoggedIn => !isLoggedIn); constructor(private http: HttpClient) { this.http.get<User>('/api/user') // when there is valid session id, emit the user$ .subscribe((user) => this.subject.next(user ? user : ANONYMOUS_USER)); } signUp(email: string, password: string) { return this.http.post<User>('/api/signup', { email, password }).shareReplay() .do((user) => this.subject.next(user)); } }
相关文章推荐
- github安装问题解决"Unable to retrieve your user info from the server"
- save username in session and then retrieve username from session
- userData && sessionStorage
- Using SharePoint 2003 Web Services to Retrieve Data From A List
- java_web初学笔记之<Jsp四个域对象page/request/session/application>
- JavaWeb之会话技术Cookie&Session
- visual event recognition in videos by learning from web data
- [AngularJS + Webpack] Requiring CSS & Preprocessors
- Data source rejected establishment of connection, message from server: "Too many connections"
- data too long for column 'Auser' at row 1
- input from 表单提交 使用 属性 disabled="disabled" 后台接收不到name="username"的值
- Implementing & Consuming ASP.NET WEB API from JQuery (MVC 4)
- Tutorial: Importing and analyzing data from a Web Page using Power BI Desktop
- 使用OGG"Loading data from file to Replicat"的方法应该注意的问题:replicat进程是前台进程
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction
- 在 AllUserData table 中查找 "people or group"
- Data source rejected establishment of connection, message from server: "Too many connections"
- visual event recognition in videos by learning from web data
- Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find
- warning C4244: '=' : conversion from 'int' to 'float', possible loss of data