单点登陆(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     }                

优质内容筛选与推荐>>
1、Nginx的client_header_buffer_size和large_client_header_buffers学习
2、dubbox注解的一个坑
3、BZOJ 3930 选数
4、Thunder love Jordan 11 Retro Concord
5、js高程笔记16-20章


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn