zoukankan      html  css  js  c++  java
  • sso系统登录以及jsonp原理

    登录的处理流程:

    1、登录页面提交用户名密码。

    2、登录成功后生成tokenToken相当于原来的jsessionid,字符串,可以使用uuid

    3、把用户信息保存到redisKey就是tokenvalue就是TbUser对象转换成json

    4、使用String类型保存Session信息。可以使用“前缀:token”为key

    5、设置key的过期时间。模拟Session的过期时间。一般半个小时。

    6、token写入cookie中。

    7、Cookie需要跨域。例如www.e3.comsso.e3.comorder.e3.com,可以使用工具类。

    8、Cookie的有效期。关闭浏览器失效。

    9、登录成功。

    1.1.1. Service

    参数:

    1、用户名:String username

    2、密码:String password

    返回值:e3Result,包装token

    业务逻辑:

    1、判断用户名密码是否正确。

    2、登录成功后生成tokenToken相当于原来的jsessionid,字符串,可以使用uuid

    3、把用户信息保存到redisKey就是tokenvalue就是TbUser对象转换成json

    4、使用String类型保存Session信息。可以使用“前缀:token”为key

    5、设置key的过期时间。模拟Session的过期时间。一般半个小时。

    6、返回e3Result包装token

    @Override

    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.1.2. 表现层

    引用服务:

    Controller

    请求的url/user/login

    请求的方法:POST

    参数:usernamepassword,表单提交的数据。可以使用方法的形参接收。

    HttpServletRequestHttpServletResponse

    返回值:json数据,使用e3Result包含一个token

    业务逻辑:

    1、接收两个参数。

    2、调用Service进行登录。

    3、从返回结果中取token,写入cookieCookie要跨域。

    Cookie二级域名跨域需要设置:

    1setDomain,设置一级域名:

    .itcatst.cn

    .e3.com

    .e3.com.cn

    2setPath。设置为“/

    工具类放到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();

    CookieUtils.setCookie(request, response, COOKIE_TOKEN_KEY, token);

    // 4、响应数据。Json数据。e3Result,其中包含Token。

    return result;

    }

    1.1. 通过token查询用户信息

    1.1.1. 功能分析

    请求的url/user/token/{token}

    参数:String token需要从url中取。

    返回值:json数据。使用e3Result包装Tbuser对象。

    业务逻辑:

    1、url中取参数。

    2、根据token查询redis

    3、如果查询不到数据。返回用户已经过期。

    4、如果查询到数据,说明用户已经登录。

    5、需要重置key的过期时间。

    6、json数据转换成TbUser对象,然后使用e3Result包装并返回。

    1.1.2. Dao

    使用JedisClient对象。

    1.1.3. Service

    参数:String token

    返回值:e3Result

    @Override

    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.1.4. 表现层

    请求的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.1.5. 安全退出

    需要根据token删除redis中的key

    Js不可以跨域请求数据。

    什么是跨域:

    1、域名不同

    2、域名相同端口不同。

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

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

    1.1. Jsonp原理

    1.1. Json实现

    1.1.1. 客户端

    使用jQuery

    1.1.2. 服务端

    1、接收callback参数,取回调的js的方法名。

    2、业务逻辑处理。

    3、响应结果,拼接一个js语句。

     

  • 相关阅读:
    Linux命令之du命令
    6562. 【GDOI2020模拟4.15】楼房搭建(building)
    CF660E. Different Subsets For All Tuples
    6555. 【GDOI2020模拟4.11】黑红兔(brr)(SAM小技♂巧)
    6554. 【GDOI2020模拟4.11】赢家(winner)
    6553. 【GDOI2020模拟4.11】人生(life)
    6546. 【GDOI2020模拟4.8】USACO 2020 Open Contest, Platinum(circus)
    6545. 【GDOI2020模拟4.8】USACO 2020 Open Contest, Platinum(exercise)
    6544. 【USACO 2020 US Open Platinum】 Sprinklers 2: Return of the Alfalfa
    6543. 【GDOI2020模拟4.4】Easy Data Structure(动态dp)
  • 原文地址:https://www.cnblogs.com/yyxq/p/9301658.html
Copyright © 2011-2022 走看看