Kakao API请求成功后如何执行Controller设置logStatus会话属性?
问题解决方案
问题分析
- Kakao登录成功后需要在服务器端设置会话属性
logStatus="Y",但原loginOk接口依赖u_id、u_pw参数,Kakao登录流程无法提供这些参数,导致调用时触发MyBatis参数设置异常(5xx错误),Ajax成功回调无法执行。 - 原接口逻辑依赖
UserDTO对象,但Kakao登录无法生成该对象,无需执行原有账号密码验证逻辑。
修改步骤
1. 前端JSP的kakaoLogin函数修改
移除冗余页面跳转,调整Ajax请求至新接口,可选择性传递Kakao返回的用户标识(用于后续关联本地用户):
function kakaoLogin() { Kakao.Auth.login({ success: function (response) { Kakao.API.request({ url: '/v2/user/me', success: function (kakaoUser) { $.ajax({ url: '/kakaoLoginOk', type: 'POST', data: { kakaoId: kakaoUser.id }, // 可选:传递Kakao用户ID用于后续关联 success: function () { window.location.href = '/smhrd'; }, error: function (error) { console.log('Kakao登录会话设置失败:', error); }, }); }, fail: function (error) { console.log('Kakao用户信息获取失败:', error); }, }); }, fail: function (error) { console.log('Kakao授权登录失败:', error); }, }); }
2. 后端Spring Controller新增专属接口
创建专门处理Kakao登录后的会话设置接口,无需u_id、u_pw参数:
@PostMapping("/kakaoLoginOk") public ResponseEntity<Void> kakaoLoginOk(HttpSession session, @RequestParam(required = false) Long kakaoId) { // 直接设置登录状态会话属性 session.setAttribute("logStatus", "Y"); // 可选:若后续需要关联本地用户,可在此处通过kakaoId查询或创建用户 // UserDTO dto = service.findOrCreateByKakaoId(kakaoId); // if (dto != null) { // session.setAttribute("logId", dto.getU_id()); // session.setAttribute("logName", dto.getU_name()); // } return ResponseEntity.ok().build(); }
3. 保留原loginOk接口
原loginOk接口无需修改,继续用于传统账号密码登录流程。
错误原因说明
原5xx错误是因为调用loginOk时未传递u_id和u_pw参数,MyBatis执行SQL时无法完成参数映射,触发参数设置异常。新接口跳过了账号密码验证逻辑,直接设置会话状态,彻底解决参数缺失问题。
内容的提问来源于stack exchange,提问作者Uranus_ly
相关产品推荐
相关产品推荐

