最近后台管理新上线了两个功能,一个是ai问答,一个是ai绘画,两个功能分别对应的是两个独立的二级域名,其中ai绘画是需要登录使用并且消耗积分的。
这就产生了一个问题,因为是从后台管理页面跳转过去的,所以正常情况下应该是跳转过去之后应该默认带上当前登录的用户信息,就能直接使用绘画功能的,但是现实情况是不行的。
因为现有的登录功能是没有把用户的token写入到cookie中的,所以最终的免密方案就是通过cookie来实现。
首先,需要在后台管理登录的时候将token写入cookie。
@PostMapping("/login")\r\n public ResponseMap login(@RequestBody AccountDto accountDto, HttpServletRequest request, HttpServletResponse response) throws Exception {\r\n String ip = commonUtils.getIpAddr(request);\r\n UserDto userInfo = accountService.login(accountDto,ip);\r\n Cookie cookie = new Cookie("authorizationToken",userInfo.getToken());\r\n cookie.setDomain("dsiab.com");\r\n cookie.setPath("/");\r\n response.addCookie(cookie);\r\n return ResponseMap.success(userInfo);\r\n }这样在登录成功后由于浏览器的特性后续所有的请求就默认带上了cookie。
带上cookie之后就好办了,在绘画的域名服务请求也会带上该cookie,这样只需要从请求的cookie中解析用户信息就能实现登录效果了。
public void updateUserScore (HttpServletRequest request){\r\n String token = jwtTokenUtil.getToken(request);\r\n // 如果请求头没有token,就从cookie中取token\r\n Cookie[] cookies = request.getCookies();\r\n // 如果请求头没有token,就从cookie中取token\r\n if (token == null && cookies != null){\r\n for (Cookie cookie : cookies){\r\n if (cookie.getName().equals("authorizationToken")){\r\n token = cookie.getValue();\r\n }\r\n }\r\n }\r\n String username= jwtTokenUtil.getUsernameFromToken(token);\r\n ...\r\n };默认从headers里面获取token,如果为空则从cookie中获取,后面的流程跟现有的请求保持一致即可。