[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));
  }

}
时间: 2024-11-08 16:28:31

[Angular & Web] Retrieve user data from Session的相关文章

Android -- 与WEB交互在同一个会话Session中通信

Session与Cookie Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实现,也可以用URL回写的机制来实现. Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端,Session将状态保存在服务器端: 2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.网络服务器用HTTP头向客户端发送cookies,在客户

Web API With AJAX: Handle Session in Web API

Web API With AJAX: Handle Session in Web API

Python Web学习笔记之Cookie,Session,Token区别

一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that is used in network communications (often over HTTP) to identify a session, a series of related message exchanges. Session identifiers become necessary

Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此基础上又扩展成为了WCF,基于SOAP协议,基于WCF标准需要一些配置上的改变.现如今,大势所趋我们只需要HTTP协议以及更加优美的JSON格式,这时将不得不出现一个更加轻量级的Web服务技术.当然,Web Service和WCF虽然有其局限性但是其仍被许多企业所广泛应用,说明一时半会还不会被淘汰,

记录一些有关web安全以及cookie、session的文章

session和cookie的区别和联系:http://www.cnblogs.com/endlessdream/p/4699273.html HTTP是无状态的协议,那么客户端与服务端的数据一旦交互完毕,客户端与服务器端的链接也就会关闭了,当再次交换数据的时候就需要建立新的链接,也就是服务器无法从链接上跟踪会话: 会话跟踪:是web程序中常用的技术,用来跟踪用户的整个会话的,常用的会话跟踪技术是Cookie和Session.Cookie通过在客户端记录信息确定用户身份后,Session通过在服

C# Web 数据注解Data Annotations、模型状态ModelState、数据验证

C#中的模型状态与数据注解,为我们提供了很便利的请求数据的验证. 1. ModelState ModelState在进行数据验证的时候很有用的,它是: 1)验证数据,以及保存数据对应的错误信息. 2)微软的一种DRY(Don't Repeat Yourself)设计,通过ModelState可以做服务端验证,同时可以配合jquery validation生成前端数据验证 2. 数据注解Data Annotations.数据验证 如果我们想要添加数据验证,首先要创建我们的数据验证实体. 比如,我们

关于angular $http 中的data传递参数(json字符串)后端没法接收的问题

使用的angular版本1.6.4,后台采用springMVC.项目要实行前后台分离,前后台交互都采用json,刚开始有些抗拒.不否认,angular确实好用,不用再花很多心思在繁琐的dom上了.不过小白我刚刚接触,废了半天劲,传个值都没搞定,心累.且不论POST对应data,GET对应params的低级错误.虽然后来知道是angular的$http传值Content-Type默认是'application/json',可没想到 headers: {'Content-Type': 'applic

Java Web(三) -- Cookie &amp; Session

中文文件下载 针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE.Chrome ... 使用的是URLEncoder /* * 如果文件的名字带有中文,那么需要对这个文件名进行编码处理 * 如果是IE ,或者 Chrome (谷歌浏览器) ,使用URLEncoding 编码 * 如果是Firefox , 使用Base64编码 */ // 获取来访的客户端类型 String clientType = request.getHeader("User-Agent"

Java web 会话技术 cookie与session

一.会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据. 二.保存会话数据的两种技术 1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是