xmall商城学习笔记
文章目录
前言
提示:今天要看的xmall-sso,单点登录模块
一、单点登录是什么?
简单讲就是在一个系统(模块中登录)其他模块或系统都可以访问,无需在登录
这边有一篇文章讲的很透彻:单点登录的原理
我们这边主要来研究xmall是如何实现的,并且对它优化
二、项目结构
很明显这是一个服务,他是注册到zookeeper中的
我们主要看service ,它下面又三个文件比较重要
LoginServiceImpl、MemberServiceImpl、RegisterServiceImpl
RegisterServiceImpl 里是注册账号的,就是对数据库的查找和插入,这个不难。
我们来看LoginServiceImpl这个类,它只有三个方法userLogin、getUserByToken、logout
先看第一个方法
List<TbMember> list = tbMemberMapper.selectByExample(example);
if (list == null || list.size() == 0) {
Member member=new Member();
member.setState(0);
member.setMessage("用户名或密码错误");
return member;
}
TbMember tbMember = list.get(0);
//md5加密
if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(tbMember.getPassword())) {
Member member=new Member();
member.setState(0);
member.setMessage("用户名或密码错误");
return member;
}
String token = UUID.randomUUID().toString();
Member member= DtoUtil.TbMemer2Member(tbMember);
member.setToken(token);
member.setState(1);
// 用户信息写入redis:key:"SESSION:token" value:"user"
jedisClient.set("SESSION:" + token, new Gson().toJson(member));
jedisClient.expire("SESSION:" + token, SESSION_EXPIRE);
这段代码是核心了,主要就是去数据库查找用户,如果没有就抛异常,如果有就把生成token 存放到redis中并且设置过期时间。
代码如下(示例):
getUserByToken 这个方法就是用来验证登录状态的根据Token
然后“充值”过期时间
String json = jedisClient.get("SESSION:" + token);
if (json==null) {
Member member=new Member();
member.setState(0);
member.setMessage("用户登录已过期");
return member;
}
//重置过期时间
jedisClient.expire("SESSION:" + token, SESSION_EXPIRE);
Member member = new Gson().fromJson(json,Member.class);
return member;
logout 就两行代码
清空redis登录信息
jedisClient.del("SESSION:" + token);
return 1;
MemberServiceImpl 这个类就一个方法imageUpload,用来更新头像的
总结
文章到这儿还远远没有结束,这么项目我们知道它用来shiro鉴权框架,那它和登录又什么关系呢?还有网上很火的JWT是什么呢?xmall的思路是不是和他们一致呢?后面我会修改这个项目的登录实现。