前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis实现单点登录原理(spring ioc和aop原理及应用场合)

redis实现单点登录原理(spring ioc和aop原理及应用场合)

作者头像
全栈程序员站长
发布2022-07-27 17:25:47
1K0
发布2022-07-27 17:25:47
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

单点登录功能分析 请求的url:/user/login 请求的方法:POST 参数:username、password,表单提交的数据。可以使用方法的形参接收。 返回值:json数据,包含一个token。 业务逻辑: 登录的业务流程:

登录的处理流程:

1、登录页面提交用户名密码。 2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。 3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。 4、使用String类型保存Session信息。可以使用“前缀:token”为key 5、设置key的过期时间。模拟Session的过期时间。一般半个小时。 6、把token写入cookie中。 7、Cookie需要跨域。例如www.jd.com\sso.jd.com\order.jd.com,可以使用工具类。 8、Cookie的有效期。关闭浏览器失效。 9、登录成功。

Dao层

查询tb_user表。单表查询。可以使用逆向工程。

Service层

参数: 1、用户名:String username 2、密码:String password 返回值:e3Result,包装token。 业务逻辑: 1、判断用户名密码是否正确。 2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。 3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。 4、使用String类型保存Session信息。可以使用“前缀:token”为key 5、设置key的过期时间。模拟Session的过期时间。一般半个小时。 6、返回e3Result包装token。 代码:

代码语言:javascript
复制
public e3Result login(String username, String password) {
        // 1、判断用户名密码是否正确。
        TbUserExample example = new TbUserExample();
        Criteria criteria = example.createCriteria();
        criteria.andUsernameEqualTo(username);
        //查询用户信息
        List<TbUser> list = userMapper.selectByExample(example);
        if (list == null || list.size() == 0) {
            return e3Result.build(400, "用户名或密码错误");
        }
        TbUser user = list.get(0);
        //校验密码
        if (!user.getPassword().equals(DigestUtils.md5DigestAsHex(password.getBytes()))) {
            return e3Result.build(400, "用户名或密码错误");
        }
        // 2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
        String token = UUID.randomUUID().toString();
        // 3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
        // 4、使用String类型保存Session信息。可以使用“前缀:token”为key
        user.setPassword(null);
        jedisClient.set(USER_INFO + ":" + token, JsonUtils.objectToJson(user));
        // 5、设置key的过期时间。模拟Session的过期时间。一般半个小时。
        jedisClient.expire(USER_INFO + ":" + token, SESSION_EXPIRE);
        // 6、返回e3Result包装token。
        return e3Result.ok(token);
    }
Controller层

请求的url:/user/login 请求的方法:POST 参数:username、password,表单提交的数据。可以使用方法的形参接收。 HttpServletRequest、HttpServletResponse 返回值:json数据,使用e3Result包含一个token。 业务逻辑: 1、接收两个参数。 2、调用Service进行登录。 3、从返回结果中取token,写入cookie。Cookie要跨域。 Cookie二级域名跨域需要设置: 1)setDomain,设置一级域名: .itcatst.cn .e3.com .e3.com.cn 2)setPath。设置为“/” 工具类放到e3-common工程中。 4、响应数据。Json数据。e3Result,其中包含Token。 代码:

代码语言:javascript
复制
    @RequestMapping(value="/user/login", method=RequestMethod.POST)
    @ResponseBody
    public e3Result login(String username, String password,
            HttpServletRequest request, HttpServletResponse response) {
        // 1、接收两个参数。
        // 2、调用Service进行登录。
        e3Result result = userService.login(username, password);
        // 3、从返回结果中取token,写入cookie。Cookie要跨域。
        String token = result.getData().toString();
        //设置cookie的key和value,key随便字符串,value为token值
        CookieUtils.setCookie(request, response, COOKIE_TOKEN_KEY, token);
        // 4、响应数据。Json数据。e3Result,其中包含Token。
        return result;

    }

通过token查询用户信息

功能分析 请求的url:/user/token/{token} 参数:String token需要从url中取。 返回值:json数据。使用e3Result包装Tbuser对象。

业务逻辑: 1、从url中取参数。 2、根据token查询redis。 3、如果查询不到数据。返回用户已经过期。 4、如果查询到数据,说明用户已经登录。 5、需要重置key的过期时间。 6、把json数据转换成TbUser对象,然后使用e3Result包装并返回。

Dao层

使用JedisClient对象。

Service层

参数:String token 返回值:e3Result 代码:

代码语言:javascript
复制
public e3Result getUserByToken(String token) {
        // 2、根据token查询redis。
        String json = jedisClient.get(USER_INFO + ":" + token);
        if (StringUtils.isBlank(json)) {
            // 3、如果查询不到数据。返回用户已经过期。
            return e3Result.build(400, "用户登录已经过期,请重新登录。");
        }
        // 4、如果查询到数据,说明用户已经登录。
        // 5、需要重置key的过期时间。
        jedisClient.expire(USER_INFO + ":" + token, SESSION_EXPIRE);
        // 6、把json数据转换成TbUser对象,然后使用e3Result包装并返回。
        TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
        return e3Result.ok(user);
    }
表现层

请求的url:/user/token/{token} 参数:String token需要从url中取。 返回值:json数据。使用e3Result包装Tbuser对象。 代码:

代码语言:javascript
复制
    @RequestMapping("/user/token/{token}")
    @ResponseBody
    public e3Result getUserByToken(@PathVariable String token) {
        e3Result result = userService.getUserByToken(token);
        return result;
    }

安全退出

需要根据token删除redis中的key。

跨域问题

什么是跨域: 1、域名不同 2、域名相同端口不同。

解决js的跨域问题可以使用jsonp。

Jsonp不是新技术,跨域的解决方案。使用js的特性绕过跨域请求。Js可以跨域加载js文件。

JSONP原理:

Json实现

客户端 使用jQuery。

服务端 1、接收callback参数,取回调的js的方法名。 2、业务逻辑处理。 3、响应结果,拼接一个js语句。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128192.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 登录的处理流程:
    • Dao层
      • Service层
        • Controller层
        • 通过token查询用户信息
          • Dao层
            • Service层
              • 表现层
              • 安全退出
              • 跨域问题
              相关产品与服务
              云数据库 Redis®
              腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档