关于 OJ 系统中第 16 节前后端联调cookie丢失的问题

结论

没找到后端设置 cookie 的路径要求的位置,但是在控制台可以看到请求登录的 session 字段如下:

bug-cookie.png 可以看到 cookie 要求是 Path 中是以 /api 开头的, 而如果 OPENAPI 字段的 BASE 属性: http://localhost:8121 后多了一个杠, 路径会变成://api/user/get/login ,不符合该 cookie 的发送条件,因此第二次发送不会携带 cookie。

同时,我还验证了下请求后端的时候的路径匹配不是很严格,/api 前1~4 个斜杠都不影响 UserLogin 的请求,可能是 cookie 路径验证匹配比较严格,导致多了一个 / 。

比较标准的格式是:BASE 属性不带 /,请求路径中以 / 开头。

以下是检验的尝试:

typescript
复制代码
public static userLoginUsingPost( userLoginRequest: UserLoginRequest ): CancelablePromise<BaseResponse_LoginUserVO_ | any> { return __request(OpenAPI, { method: "POST", // 五个斜杠开始就无法匹配了 url: "/////api/user/login", url: "/api/user/login", body: userLoginRequest, errors: { 401: `Unauthorized`, 403: `Forbidden`, 404: `Not Found`, }, }); }
typescript
复制代码
public static getLoginUserUsingGet(): CancelablePromise<BaseResponse_LoginUserVO_> { return __request(OpenAPI, { method: "GET", //如果导致url变成 "//api/user/get/login",会因为cookie路径要求前置为 /api 不匹配导致bug url: "/api/user/get/login", errors: { 401: `Unauthorized`, 403: `Forbidden`, 404: `Not Found`, }, }); }

通过若干的输出来定位bug,

正确程序的输出
image.png
错误程序的输出:
image.png

整体流程为:

  1. 调用 userLoginUsingPost 登录,如果登录成功应该得到一串 session 作为标识,后续和后端的验证都通过这串 session 。
  2. getLoginUser 通过 session 获得用户信息,如果 session 存在则会将返回的信息存储入 store.state,然后前端就有信息可以显示了;否则继承之前的状态,并将登录状态设置为 notlogin;
  3. 可以发现错误程序的 bug 是从 getLoginUser 开始的,通过查看 edge F12 的 应用程序 中的cookie 和 网络中的请求头字段,可以发现 userLoginUsingPost 返回了 cookie,但是后续请求中都没有发送 cookie。
  4. 通过后端的输出,进一步确认了后端压根没有收到session,于是不断检查各种可能的配置的问题,最后终于是灵光乍现,看到 /api 的时候想到 端口号最后也加了 / ,是不是这个问题,结果发现真的是。
  5. 修复后 getLoginUser 通过 session 获得用户信息,存储入 store.state ,然后前端就有信息可以显示了;

PS:

  1. 发现后端数据库密码和我设置的不一样,还以为是密码设置的问题,后来突然想起来是加密了。
  2. 我还怀疑过是不是数据库的SALT替换出问题了,但是前端能登录验证说明应该是没有问题。
  3. 网上压根找不到关于这个bug的说法,ai 直接说不会有bug,离谱。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP