session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户
我们使用的是nestjs 默认框架express 他也支持express 的插件 所以我们就可以安装express的session
npm i express-session --save
需要智能提示可以装一个声明依赖
npm i @types/express-session -D
然后在main.ts 引入 通过app.use 注册session
- import * as session from 'express-session'
-
-
- app.use(session())
| secret | 生成服务端session 签名 可以理解为加盐 |
| name | 生成客户端cookie 的名字 默认 connect.sid |
| cookie | 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。 |
| rolling | 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false) |
nestjs 配置
- import { NestFactory } from '@nestjs/core';
- import { VersioningType } from '@nestjs/common';
- import { AppModule } from './app.module';
- import * as session from 'express-session'
- async function bootstrap() {
- const app = await NestFactory.create(AppModule);
- app.enableVersioning({
- type: VersioningType.URI
- })
- app.use(session({ secret: "XiaoMan", name: "xm.session", rolling: true, cookie: { maxAge: null } }))
- await app.listen(3000);
- }
- bootstrap();
前端 vue3 ts element-plus fetch
安装element
npm install element-plus -S
然后简单的绘制页面
- <template>
- <div class="wraps">
- <el-form :label-position="labelPosition" label-width="100px" :model="formLabelAlign" style="max-width: 460px">
- <el-form-item label="账号">
- <el-input v-model="formLabelAlign.name" />
- el-form-item>
- <el-form-item label="密码">
- <el-input type="password" v-model="formLabelAlign.password" />
- el-form-item>
- <el-form-item label="验证码">
- <div style="display:flex">
- <el-input v-model="formLabelAlign.code" />
- <img @click="resetCode" :src="codeUrl" alt="">
- div>
- el-form-item>
- <el-form-item>
- <el-button @click="submit">登录el-button>
- el-form-item>
- el-form>
- div>
- template>
-
- <script setup lang='ts'>
- import { onMounted, reactive, ref } from 'vue';
-
- const codeUrl = ref
('/api/user/code') -
- const resetCode = () => codeUrl.value = codeUrl.value + '?' + Math.random()
-
- const labelPosition = ref
('right') -
- const formLabelAlign = reactive({
- name: "",
- password: "",
- code: ""
- })
-
- const submit = async () => {
- await fetch('/api/user/create', {
- method: "POST",
- body: JSON.stringify(formLabelAlign),
- headers: {
- 'content-type': 'application/json'
- }
- }).then(res => res.json())
- }
-
-
-
- script>
-
- <style>
- * {
- padding: 0;
- margin: 0;
- }
-
- .wraps {
- display: flex;
- justify-content: center;
- align-items: center;
- height: inherit;
- }
-
- html,
- body,
- #app {
- height: 100%;
- }
- style>

我们可以看到 session 已经存到了浏览器

跨域我用了本地dev 解决的
- proxy:{
- '/api':{
- target:'http://localhost:3000/',
- changeOrigin:true,
- rewrite: path => path.replace(/^\/api/, ''),
- }
- }
后端nestjs 验证码插件 svgCaptcha
npm install svg-captcha -S
- import { Controller, Get, Post, Body, Param, Request, Query, Headers, HttpCode, Res, Req } from '@nestjs/common';
- import { UserService } from './user.service';
- import { CreateUserDto } from './dto/create-user.dto';
- import { UpdateUserDto } from './dto/update-user.dto';
- 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: 4,//生成几个验证码
- fontSize: 50, //文字大小
- width: 100, //宽度
- height: 34, //高度
- background: '#cc9966', //背景颜色
- })
- req.session.code = captcha.text //存储验证码记录到session
- res.type('image/svg+xml')
- res.send(captcha.data)
- }
-
- @Post('create')
- createUser(@Req() req, @Body() body) {
- console.log(req.session.code, body)
- if (req.session.code.toLocaleLowerCase() === body?.code?.toLocaleLowerCase()) {
- return {
- message: "验证码正确"
- }
- } else {
- return {
- message: "验证码错误"
- }
- }
-
- }
- }
