关于 OJ 系统中第 16 节前后端联调cookie丢失的问题
结论
没找到后端设置 cookie 的路径要求的位置,但是在控制台可以看到请求登录的 session 字段如下:
可以看到 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,
正确程序的输出
错误程序的输出:
整体流程为:
- 调用 userLoginUsingPost 登录,如果登录成功应该得到一串 session 作为标识,后续和后端的验证都通过这串 session 。
- getLoginUser 通过 session 获得用户信息,如果 session 存在则会将返回的信息存储入 store.state,然后前端就有信息可以显示了;否则继承之前的状态,并将登录状态设置为 notlogin;
- 可以发现错误程序的 bug 是从 getLoginUser 开始的,通过查看 edge F12 的 应用程序 中的cookie 和 网络中的请求头字段,可以发现 userLoginUsingPost 返回了 cookie,但是后续请求中都没有发送 cookie。
- 通过后端的输出,进一步确认了后端压根没有收到session,于是不断检查各种可能的配置的问题,最后终于是灵光乍现,看到 /api 的时候想到 端口号最后也加了 / ,是不是这个问题,结果发现真的是。
- 修复后 getLoginUser 通过 session 获得用户信息,存储入 store.state ,然后前端就有信息可以显示了;
PS:
- 发现后端数据库密码和我设置的不一样,还以为是密码设置的问题,后来突然想起来是加密了。
- 我还怀疑过是不是数据库的SALT替换出问题了,但是前端能登录验证说明应该是没有问题。
- 网上压根找不到关于这个bug的说法,ai 直接说不会有bug,离谱。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
