【SSO】单点登录 & Session共享

单点登录

背景:

Tomcat集群可能因为两次访问的Session不一致导致登录失败,无法访问后续页面;
解决可以通过tomcat互相进行Session共享实现,但是这仅仅试用于小集群;
如果集群变大,就会有大量Session进行互相共享,负载很大;

SSO

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

通过在Redis集中管理用户的Session,其它服务的工程都为无状态的Tomcat,这样实现的单点登录,集群的大小就不会受到限制。

 

登录业务

【SSO】单点登录 & Session共享_第1张图片

  1. 校验表单信息;
  2. 生成UUID作为token发送给Redis;
  3. Session存入Redis,key为token,用户信息为value,设置过期时间;
  4. 返回token存入客户端Cookie;

 

SSO系统使用流程

【SSO】单点登录 & Session共享_第2张图片

查询订单(token过期)

  1. 从Cookie中获取token查询redis;
  2. redis返回不存在,页面跳转到登录页;

查询订单(token未过期)

  1. 从Cookie中获取token查询redis;
  2. redis存在token,重置该token过期时间;
  3. 返回用户登录信息,显示订单信息;

 

jsonp解决跨域问题

跨域请求:如果 域名不同 或者 端口不同,浏览器视作跨域,不允许请求数据

【SSO】单点登录 & Session共享_第3张图片

原理

  1. 定义mycall方法;
  2. 通过js跨域加载文件,参数为callback=mycall;
  3. 服务器识别callback,把json数据拼接为mycall({json data})变成js语句;
  4. 浏览器接收到返回数据后会直接执行js语句,从而调用mycall方法;

使用

  1. 客户端修改ajax的datatype:datatype:"jsonp"
  2. 服务端修改controller:增加参数callback
@RequestMapping(value="/user/token/{token}")
@ResponseBody
public Object getUserByToken(@PathVariable String token, String callback) {
    Result result = tokenService.getUserByToken(token);
    //响应结果之前,判断是否为jsonp请求
    if (StringUtils.isNotBlank(callback)) {
        //把结果封装成一个js语句响应
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
        mappingJacksonValue.setJsonpFunction(callback);
        return mappingJacksonValue;
    }
    return result;
}

你可能感兴趣的:(【,Java,】,………sso)