Session Node 实现登录遇到的问题 起因 --> 解决

148 阅读2分钟

问题起因:

1、关于后端通过session返回的session_id,前端接收Set-Cookie为什么不能自动在浏览器开发者模式下的Application中的Cookie中存储?

2、有多个接口调用时,每个接口的都是独一无二的 Set-Cookie导致了数据不能同屏

3、导致只有在后端接口中设置过 req.session.a = a 的接口默认有返回的Set-Cookie

而每个接口返回的sessoion_id都不同

导致这样的原因是 前端后端 没有设置 WithCredentials: true

解决:

1、首先要在 前端 axios 配置文件夹中设置 WithCredentials: true

image-20220823202535855.png

2、后端配置两种方式

方式一

在(我后端使用的是Node)后端 跨域中做同样的配置

1、安装:npm install cors

2、导入:const cors = require('cors');

3、使用cors()中间件:

// 解决跨域问题 (跨域资源共享)
// credentials: true -> 跨域请求是否提供凭据信息(cookie、HTTP认证及客户端[SSL])
app.use(cors({ credentials: true, origin: true }));

image-20220823203059772.png

方式二

1、前端WithCredentials: true设置了该属性为 true 时,后端需要设置Access-Control-Allow-Origin为前端项目的源地址 (我的项目源地址:http://localhost:5173)

注意:不可设置为 ' * '

错误示范 ❌

res.header("Access-Control-Allow-Origin", "*")`

正确示范✔

res.header("Access-Control-Allow-Origin", "http://localhost:5173")` 

2、此外还需要设置Access-Control-Allow-Creaentialstrue

res.header('Access-Control-Allow-Creaentials', true)

完整代码:

app.all("*", (req, res, next) => {
    // Access-Control-Allow-Origin必须设置与之匹配的地址,如果设置为 * cookie会失效
  res.header("Access-Control-Allow-Origin", "http://localhost:5173"); 
  res.header("Access-Control-Allow-Credentials", "true"); 
  next();
});

3、在前端 axios 配置中必须和后端的域名一致

例如

后端地址http://localhost:2022

前端也得使用 localhost 进行配置接口,严格区分 数字字母 127.0.0.1 != localhost

否则还是不能同屏后端传递过来的 set-cookie 例如:

前端

image.png

后端

image.png

withCredentials 有什么用?

1、简单的理解为,当前请求为跨域类型时是否在请求中协带cookie。

2、在前后端分离的项目中,一般是不需要使用session,所以在前端设置withCredentials时一直都是false

3、导致每次请求后端获取到的session_Id都是新的,无法使用session进行业务操作。

withCredentials : true 是否允许请求携带Cookie

true: 允许

false:不允许

结印 CUMIN