• 小满nestjs(第九章 nestjs Session)


    引言 

    session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户

    我们使用的是nestjs 默认框架express 他也支持express 的插件 所以我们就可以安装express的session

    npm i express-session --save

    需要智能提示可以装一个声明依赖

    npm i @types/express-session -D

    然后在main.ts 引入 通过app.use 注册session

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

    参数配置详解

    secret                                        生成服务端session 签名 可以理解为加盐
    name     生成客户端cookie 的名字 默认 connect.sid
    cookie                                                                                                 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
    rolling在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)

    nestjs 配置

    1. import { NestFactory } from '@nestjs/core';
    2. import { VersioningType } from '@nestjs/common';
    3. import { AppModule } from './app.module';
    4. import * as session from 'express-session'
    5. async function bootstrap() {
    6. const app = await NestFactory.create(AppModule);
    7. app.enableVersioning({
    8. type: VersioningType.URI
    9. })
    10. app.use(session({ secret: "XiaoMan", name: "xm.session", rolling: true, cookie: { maxAge: null } }))
    11. await app.listen(3000);
    12. }
    13. bootstrap();

    验证码案例 

    前端 vue3 ts element-plus fetch

    安装element  

    npm install element-plus -S

    然后简单的绘制页面

    1. <template>
    2. <div class="wraps">
    3. <el-form :label-position="labelPosition" label-width="100px" :model="formLabelAlign" style="max-width: 460px">
    4. <el-form-item label="账号">
    5. <el-input v-model="formLabelAlign.name" />
    6. el-form-item>
    7. <el-form-item label="密码">
    8. <el-input type="password" v-model="formLabelAlign.password" />
    9. el-form-item>
    10. <el-form-item label="验证码">
    11. <div style="display:flex">
    12. <el-input v-model="formLabelAlign.code" />
    13. <img @click="resetCode" :src="codeUrl" alt="">
    14. div>
    15. el-form-item>
    16. <el-form-item>
    17. <el-button @click="submit">登录el-button>
    18. el-form-item>
    19. el-form>
    20. div>
    21. template>
    22. <script setup lang='ts'>
    23. import { onMounted, reactive, ref } from 'vue';
    24. const codeUrl = ref('/api/user/code')
    25. const resetCode = () => codeUrl.value = codeUrl.value + '?' + Math.random()
    26. const labelPosition = ref('right')
    27. const formLabelAlign = reactive({
    28. name: "",
    29. password: "",
    30. code: ""
    31. })
    32. const submit = async () => {
    33. await fetch('/api/user/create', {
    34. method: "POST",
    35. body: JSON.stringify(formLabelAlign),
    36. headers: {
    37. 'content-type': 'application/json'
    38. }
    39. }).then(res => res.json())
    40. }
    41. script>
    42. <style>
    43. * {
    44. padding: 0;
    45. margin: 0;
    46. }
    47. .wraps {
    48. display: flex;
    49. justify-content: center;
    50. align-items: center;
    51. height: inherit;
    52. }
    53. html,
    54. body,
    55. #app {
    56. height: 100%;
    57. }
    58. style>

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

    跨域我用了本地dev 解决的

    1. proxy:{
    2. '/api':{
    3. target:'http://localhost:3000/',
    4. changeOrigin:true,
    5. rewrite: path => path.replace(/^\/api/, ''),
    6. }
    7. }

    后端nestjs  验证码插件 svgCaptcha

    npm install svg-captcha -S
    1. import { Controller, Get, Post, Body, Param, Request, Query, Headers, HttpCode, Res, Req } from '@nestjs/common';
    2. import { UserService } from './user.service';
    3. import { CreateUserDto } from './dto/create-user.dto';
    4. import { UpdateUserDto } from './dto/update-user.dto';
    5. import * as svgCaptcha from 'svg-captcha';
    6. @Controller('user')
    7. export class UserController {
    8. constructor(private readonly userService: UserService) { }
    9. @Get('code')
    10. createCaptcha(@Req() req, @Res() res) {
    11. const captcha = svgCaptcha.create({
    12. size: 4,//生成几个验证码
    13. fontSize: 50, //文字大小
    14. width: 100, //宽度
    15. height: 34, //高度
    16. background: '#cc9966', //背景颜色
    17. })
    18. req.session.code = captcha.text //存储验证码记录到session
    19. res.type('image/svg+xml')
    20. res.send(captcha.data)
    21. }
    22. @Post('create')
    23. createUser(@Req() req, @Body() body) {
    24. console.log(req.session.code, body)
    25. if (req.session.code.toLocaleLowerCase() === body?.code?.toLocaleLowerCase()) {
    26. return {
    27. message: "验证码正确"
    28. }
    29. } else {
    30. return {
    31. message: "验证码错误"
    32. }
    33. }
    34. }
    35. }

  • 相关阅读:
    linux内核驱动之定时器
    适合上班族使用的电脑笔记软件使用哪一款
    第三十五章 使用 CSP 进行基于标签的开发 - 使用服务器端方法的提示
    Defaultdict:Python中的高效字典类
    Mybatisplus-多数据源
    事业编招聘:共青团市委所属事业单位2022年公开招聘公告
    【JVM笔记】直接内存
    分类预测 | Matlab实现QPSO-SVM、PSO-SVM、SVM多特征分类预测对比
    函数栈帧的创建与销毁剖析
    静态路由 网络实验
  • 原文地址:https://blog.csdn.net/qq1195566313/article/details/126327047