zoukankan      html  css  js  c++  java
  • Redis实现单点登录

    单点登录功能分析
    请求的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.comsso.jd.comorder.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。
    代码:

    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);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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。
    代码:
    @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;

    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    通过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
    代码:

    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);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    表现层
    请求的url:/user/token/{token}
    参数:String token需要从url中取。
    返回值:json数据。使用e3Result包装Tbuser对象。
    代码:

    @RequestMapping("/user/token/{token}")
    @ResponseBody
    public e3Result getUserByToken(@PathVariable String token) {
    e3Result result = userService.getUserByToken(token);
    return result;
    }
    1
    2
    3
    4
    5
    6
    7
    安全退出
    需要根据token删除redis中的key。

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

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

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

    JSONP原理:

    Json实现

    客户端
    使用jQuery。

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

    ---------------------
    作者:初学者W
    来源:CSDN
    原文:https://blog.csdn.net/WuCourage/article/details/77802812
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    为什么C/C++语言使用指针
    VS2010调试入门指南
    vs2010的11个调试技巧和方法
    排序算法一:快速排序
    Ubuntu下codeblocks汉化
    Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
    QQ通信原理及QQ是怎么穿透内网进行通信的?
    jackson中自定义处理序列化和反序列化
    Json解析工具Jackson(使用注解)
    jackSon注解– @JsonInclude 注解不返回null值字段
  • 原文地址:https://www.cnblogs.com/ExMan/p/10245629.html
Copyright © 2011-2022 走看看