单点登陆(redis+cookie)
本文只是基于后台部分
大致思路:用户登录请求主登陆接口 生成token 存放redis 返回给浏览器
后续有需要登录的页面 请求验证token接口 拿着token去redis中查询如果有证明登陆过没有则证明没有登录
通过redis模拟session 因为是分布式的不同的服务器存储着不同的session 所以需要redis
分为2个接口
1.主登陆 用户第一次登陆访问的
1 @RequestMapping("/testlogin") 2 @ResponseBody 3 public LoginResult testLogin(String username, String password, HttpServletRequest request,HttpServletResponse response){ 4 return loginService.login(username,password,request,response); 5 }
1.2 a.先验证用户信息是否正确
b.在通过UUID随机数生成一个token
c.将token最为key 用户信息作为value 并设置过期时间存储在redis中
d.通过Cookie工具类 设置token name 和有效时间 返回给浏览器
1 public LoginResult login(String username, String password, HttpServletRequest request, HttpServletResponse response) { 2 /**模拟数据库查询*/ 3 User user = new User(); 4 user.setUserName(username); 5 user.setPassword(password); 6 /**返回给前台的数据格式*/ 7 LoginResult loginResult = new LoginResult(); 8 if (user != null) {/**判断从数据查询出来是否为空*/ 9 loginResult.setStatus(200); 10 String key = UUID.randomUUID().toString();/**UUID.randomUUID().toString()*/ 11 redisUtils.set(key, user);/**将token和用户信息放入redis种*/ 12 redisUtils.expire(key, 60 * 60);/**设置过期时间为一小时*/ 13 /**产生Cookie*/ 14 CookieUtils.setCookie(request, response, "TT_TOKEN", key, 60 * 60); 15 /**response.addCookie(cookie);*/ 16 } else { 17 18 /**登录失败后*/ 19 loginResult.setMsg("用户名或密码错误"); 20 21 } 22 return loginResult; 23 }
2.需要验证登陆的页面请求的接口 需要携带token
1 @RequestMapping("/testlogin/token/{token}") 2 @ResponseBody 3 public Object getUserInfo(@PathVariable("token") String token){ 4 return loginService.getUserInfoByToken(token); 5 }
1 public LoginResult getUserInfoByToken(String token) { 2 LoginResult loginResult = new LoginResult(); 3 try { 4 /**通过token去redis中查询 5 * 查不到则抛出异常 6 */ 7 String json = redisUtils.get(token).toString(); 8 loginResult.setStatus(200); 9 loginResult.setMsg("OK"); 10 loginResult.setData(json); 11 } catch (Exception e) { 12 loginResult.setMsg("获取用户失败失败"); 13 } finally { 14 15 return loginResult; 16 } 17 18 }优质内容筛选与推荐>>