NestJS学习:使用session实现登录验证
创始人
2024-02-18 03:43:37

参考

大佬的视频教程:nestjs session案例
大佬的博客地址:小满nestjs(第九章 nestjs Session)

在学习某些知识时如果有大佬的视频教程与文档真的是太爽了,能够学习到好多新知识。

nest后台

session

session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户
我们使用的是nestjs 默认框架express 他也支持express 的插件 所以我们就可以安装express的session

如果以后需要什么插件完全可以在npm里搜索express,毕竟express已经很久了,生态十分完善。

安装

npm i express-session --save

因为是基于ts的项目还需要装一个声明依赖

npm i @types/express-session -D

关于express-session找到了一篇不错的文章:深入浅出 Express 中间件 Express-session

注册session中间件

main.ts中引入并注册

import * as session from 'express-session'
app.use(session())

参数配置

参数

 cookie: {// Cookie Options// 默认为{ path: '/', httpOnly: true, secure: false, maxAge: null }/** * maxAge: 设置给定过期时间的毫秒数(date)* expires: 设定一个utc过期时间,默认不设置,http>=1.1的时代请使用maxAge代替之(string)* path: cookie的路径(默认为/)(string)* domain: 设置域名,默认为当前域(String)* sameSite: 是否为同一站点的cookie(默认为false)(可以设置为['lax', 'none', 'none']或 true)* secure: 是否以https的形式发送cookie(false以http的形式。true以https的形式)true 是默认选项。 但是,它需要启用 https 的网站。 如果通过 HTTP 访问您的站点,则不会设置 cookie。 如果使用的是 secure: true,则需要在 express 中设置“trust proxy”。* httpOnly: 是否只以http(s)的形式发送cookie,对客户端js不可用(默认为true,也就是客户端不能以document.cookie查看cookie)* signed: 是否对cookie包含签名(默认为true)* overwrite: 是否可以覆盖先前的同名cookie(默认为true)*/},// 默认使用uid-safe这个库自动生成idgenid: req => genuuid(),  // 设置会话的名字,默认为connect.sidname: 'value',  // 设置安全 cookies 时信任反向代理(通过在请求头中设置“X-Forwarded-Proto”)。默认未定义(boolean)proxy: undefined,// 是否强制保存会话,即使未被修改也要保存。默认为trueresave: true, // 强制在每个响应上设置会话标识符 cookie。 到期重置为原来的maxAge,重置到期倒计时。默认值为false。rolling: false,// 强制将“未初始化”的会话保存到存储中。 当会话是新的但未被修改时,它是未初始化的。 选择 false 对于实现登录会话、减少服务器存储使用或遵守在设置 cookie 之前需要许可的法律很有用。 选择 false 还有助于解决客户端在没有会话的情况下发出多个并行请求的竞争条件。默认值为 true。saveUninitialized: true,// 用于生成会话签名的密钥,必须项  secret: 'secret',// 会话存储实例,默认为new MemoryStore 实例。store: new MemoryStore(),// 设置是否保存会话,默认为keep。如果选择不保存可以设置'destory'unset: 'keep'

配置

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { VersioningType } from '@nestjs/common';import * as session from 'express-session';async function bootstrap() {const app = await NestFactory.create(AppModule);//启用版本控制app.enableVersioning({type: VersioningType.URI,});//注册中间件app.use(session({secret: 'abcd',name: 'abcd.session',rolling: true,cookie: { maxAge: null },}),);await app.listen(5000);
}
bootstrap();

验证码

安装

npm install svg-captcha -S

文档
相关配置官方文档很详细,可以自行查看:svg-captcha

import { Body, Controller, Get, Post, Req, Res } from '@nestjs/common';
import { UserService } from './user.service';//引入验证码
import * as svgCaptcha from 'svg-captcha';@Controller('user')
export class UserController {constructor(private readonly userService: UserService) {}//创建验证码@Get('code')createCaptcha(@Req() req, @Res() res) {//验证码const captcha = svgCaptcha.create({size: 5, //字符的个数fontSize: Math.floor(Math.random() * 10) + 40, //生成40~50大小的验证码width: 120, //宽度height: 32, //高度ignoreChars: '0oO1ilI',noise: 2, // 干扰线color: true,background: '#eee',});//存储验证码记录到sessionreq.session.code = captcha.text;//设置返回值类型,并返回res.type('image/svg+xml');res.send(captcha.data);}//校验验证码是否正确@Post('create')createUser(@Req() req, @Body() body) {if (req.session.code === body?.code) {return {code: 200,message: '验证码正确',};} else {return {code: 200,message: '验证码错误',};}}
}

常见的 http-content-type 类型
在这里插入图片描述

vue3前台

文章中使用了fetch进行请求接口,fetch不熟,这里使用axios

处理跨域

vite.config.ts

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],server: {proxy: {'/api': {target: 'http://localhost:5000/',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}}}
});

vue文件


效果图
在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...