Skip to main content

Cookie & Session

Method
Cookie.set(key: string, value: string, options: CookieSerializeOptions)
Cookie.get(key: string)
Cookie.clear(key: string)
Cookie.getAll()
例子
import { Cookie } from '@summer-js/summer'

// set cookie
Cookie.set('key','value',{ httpOnly: true })

// clear cookie
Cookie.clear('key')

配置 Session

import { SessionConfig } from '@summer-js/summer'

export const SESSION_CONFIG: SessionConfig = {
// set expire time to 60 seconds
expireIn: 60

// mode?: 'Cookie' | 'Header'
// sessionName?: string
// cookieOptions?: CookieSerializeOptions
}

使用 Session 设置 session 值

Method
Session.set(key: string, value: string)
Session.get(key: string)
Session.clear()
Session.getAll()
Session.setStorage({ storage: {
   save: (sessionId: string, key: string, value: any) => void
   load: (sessionId: string) => any
   clear: (sessionId: string) => any
   expire: (sessionId: string, expireIn: number) => void
}})
例子
import { Session } from '@summer-js/summer'

@Post('/set-session')
setSession() {
Session.set('key','value')
}

备注

Session 在不断接收到请求的时候会自动延长时间,所以用户一直使用会永不过期

自定义Session存储

默认情况下,session 不支持分布式多台服务器部署。可以修改 session 的存储方法支持。

以下给出了使用 Redis 存储 session 数据的例子

import { Controller, Get, PostConstruct, Session } from '@summer-js/summer'
import { RedisClient } from '@summer-js/redis'

@Controller('/redis-session')
export class RedisSessionController {
redisClient: RedisClient

@PostConstruct
init() {
Session.setStorage({
save: async (sessionId, key, value) => {
const sessionData = JSON.parse((await this.redisClient.get(sessionId)) || '{}')
sessionData[key] = value
await this.redisClient.set(sessionId, JSON.stringify(sessionData))
},
load: async (sessionId) => {
const sessionData = await this.redisClient.get(sessionId)
if (sessionData) {
return JSON.parse(sessionData)
}
return {}
},
clear: async (sessionId) => {
await this.redisClient.del(sessionId)
},
expire: async (sessionId, expireIn) => {
await this.redisClient.expire(sessionId, expireIn)
}
})
}

@Get('/set-session')
async setSession() {
await Session.set('id', 1)
}

@Get('/get-session')
async getSession() {
return await Session.get('id')
}
}

SessionId 与客户端通信

默认的情况下,Summer 使用 Cookie 存储 session-id,Cookie 是一种简单的配置方法,但是存在跨域问题。让 Cookie 支持跨域,你需要打开在 SERVER_CONFIG 中打开 cors, 在 SESSION_CONFIG 中设置 cookieOptions 为 { httpOnly: true, sameSite: 'none', secure: true }

或者你可以选择 Header 模式, 在 SESSION_CONFIG 设置 modeHeader,在 SERVER_CONFIG 中打开 cors, 客户度在请求头部接收到 header(SUMMER_SESSION) 时需要存储下来,在之后的请求头部将 SessionId 带上.