sso是在多个应用系统中,用户只需要登录一次,就可以访问相互信任的应用系统。它可以将这次的登录信息装填映射到其他应用中,应用于用户的登录。
使用到的技术:
- mybatis
- springmvc
- spring
- Jedis
用户登录接口:
- 接受用户名和密码
- 校验用户名和密码
- 校验成功生成token,使用UUID
- 将用户信息存入redis,key即为token
- 将token存入cookie
- 返回登陆成功将token返回到客户端
主要的地方就是将数据存入redis部分。用redis模拟session,实现多个服务器共享session进而实现单点登录。
存入redis核心代码:
//生成token
String token = UUID.randomUUID().toString();
//把用户信息写入redis
//key:REDIS_SESSION:{TOKEN}
//value:user转json
user.setPassword(null);
jedisClient.set(REDIS_SESSION_KEY + ":" + token, JsonUtils.objectToJson(user));
//设置session的过期时间
jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
//写cookie
CookieUtils.setCookie(request, response, "TT_TOKEN", token);
使用token取用户信息核心代码:
// 根据token取用户信息
String json = jedisClient.get(REDIS_SESSION_KEY + ":" + token);
//判断是否查询到结果
if (StringUtils.isBlank(json)) {
return TaotaoResult.build(400, "用户session已经过期");
}
//把json转换成java对象
TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
//更新session的过期时间
jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
接着实现登录拦截:
- 先从cookie中取tooken TT_TOKEN;
- 如果tooken为空,则返回到登录页面,否则执行3;
- 根据tooken去redis中取用户信息;
- 如果rsession已过期,则转到登录页面,否则放行。
实现登录回调(在登录成功后返回拦截器拦截的请求中的那个url):
我们在登录的那个url中加上一个参数即回调的url。登陆成功后如果url不为null转到这个url,否则转到主页。
在配置拦截器时,如果用户未登录,我们重定向到登录页面,在重定向的那个url中,将当前拦截的这个请求所请求的url设为参数,即登录成功后要回到的页面。
扫描二维码关注公众号,回复:
3881314 查看本文章