xmall商城学习笔记 登录

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的思路是不是和他们一致呢?后面我会修改这个项目的登录实现。

猜你喜欢

转载自blog.csdn.net/qq_29798755/article/details/108501578