[Angular & Web] Retrieve user data from Session
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:
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)); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-09-04 [AngualrJS] ng-strict-di
2016-09-04 [Ramda] Simple log function for debugging Compose function / Using R.tap for logging
2015-09-04 [Flux] 2. Overview and Dispatchers
2015-09-04 [Flux] 1. Development Environment Setup
2015-09-04 [CSS] Animating SVG
2015-09-04 [Node.js] Scraping Dynamic JavaScript Websites with Nightmare