我们先来看下登录流程图,如下图所示。

用户登录涉及到三个部分,第一部分是淘淘商城前台工程,第二部分是单点登录服务,第三部分是Redis服务。具体流程下图已经说的很明白了,我就不再啰嗦一遍了,相比于传统的登录,我们没有把用户登录信息存在session当中,而是存放到了Redis当中。

下面我们来实现服务端登录业务

首先是在UserService接口类中添加登录接口,如下图所示。

添加的接口代码如下:

//登录
TaotaoResult login(String username,String password);

下面我们到UserServiceImpl类来实现添加的登录接口,实现完之后,UserServiceImpl.java类的所有代码如下:

package com.taotao.sso.service.impl;import java.util.Date;
import java.util.List;
import java.util.UUID;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;import com.alibaba.fastjson.JSON;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.jedis.service.JedisClient;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.service.UserService;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate TbUserMapper tbUserMapper;@Autowired   private JedisClient jedisClient;@Value("${USER_SESSION}")private String USER_SESSION;@Value("${SESSION_EXPIRE}")private Integer SESSION_EXPIRE;@Overridepublic TaotaoResult checkUserData(String data, int type) {//设置查询条件TbUserExample example = new TbUserExample();Criteria criteria = example.createCriteria();//1.判断用户名是否可用if(type == 1){criteria.andUsernameEqualTo(data);} else if(type == 2){//2.判断电话是否可用criteria.andPhoneEqualTo(data);} else if(type == 3){//3.判断邮箱是否可用criteria.andEmailEqualTo(data);} else {return TaotaoResult.build(400, "所传参数非法!");}List<TbUser> list = tbUserMapper.selectByExample(example);if(list != null && list.size() > 0){return TaotaoResult.ok(false);} return TaotaoResult.ok(true);}@Overridepublic TaotaoResult register(TbUser tbUser) {//检查数据有效性  if(StringUtils.isBlank(tbUser.getUsername())){  return TaotaoResult.build(400, "用户名不能为空!");  }  TaotaoResult taotaoResult = checkUserData(tbUser.getUsername(), 1);  if(!(Boolean)taotaoResult.getData()){  return TaotaoResult.build(400, "用户名不能重复!");  }  if(StringUtils.isBlank(tbUser.getPassword())){  return TaotaoResult.build(400, "密码不能为空!");  }  if(StringUtils.isNotBlank(tbUser.getPhone())){  //如果电话不为空,那么接着判断是否重复,电话是不能重复的  taotaoResult = checkUserData(tbUser.getPhone(), 2);  if(!(Boolean)taotaoResult.getData()){  return TaotaoResult.build(400, "电话不能重复!");  }  }  if(StringUtils.isNotBlank(tbUser.getEmail())){  //如果邮箱不为空,那么接着判断是否重复,邮箱也是不能重复的  taotaoResult = checkUserData(tbUser.getEmail(), 3);  if(!(Boolean)taotaoResult.getData()){  return TaotaoResult.build(400, "邮箱不能重复!");  }  }  //填充属性  tbUser.setCreated(new Date());  tbUser.setUpdated(new Date());  //密码要进行Md5加密,我们不用添加额外的jar包,只需要使用Spring自带的包就可以了  String md5Str = DigestUtils.md5DigestAsHex(tbUser.getPassword().getBytes());  tbUser.setPassword(md5Str);  //添加  tbUserMapper.insert(tbUser);  return TaotaoResult.ok();  }@Overridepublic TaotaoResult login(String username, String password) {//1.判断用户名和密码是否正确TbUserExample example = new TbUserExample();Criteria criteria = example.createCriteria();criteria.andUsernameEqualTo(username);List<TbUser> list = tbUserMapper.selectByExample(example);if(list == null || list.size() == 0){//返回登录失败return TaotaoResult.build(400, "用户名或密码不正确!");}TbUser user = list.get(0);//密码要进行md5加密后再校验if(!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())){//返回登录失败return TaotaoResult.build(400, "用户名或密码不正确!");}//2.生成token,使用uuidString token = UUID.randomUUID().toString();//3.把用户信息保存到redis当中,key就是token,value就是用户信息//我们在redis中存放用户信息不要存密码,因为这样太危险了,因此我们先把密码置空user.setPassword(null);jedisClient.set(USER_SESSION+":"+token, JSON.toJSONString(user));//4.设置过期时间jedisClient.expire(USER_SESSION+":"+token, SESSION_EXPIRE);//5.返回登录成功,要记得带回token信息return TaotaoResult.ok(token);}}

login接口中用到了配置文件,如下图所示。

配置文件的内容如下:

#redis中用户session前缀
USER_SESSION=USER_SESSION
#session过期时间
SESSION_EXPIRE=1800

这样我们的Service层代码便写完了。

学习淘淘商城第八十七课(单点登录用户登录流程分析及用户登录Service层)相关推荐

  1. 学习淘淘商城第五十七课(接收Queue消息)

    上节课我们一起学习了使用ActiveMQ来发送面对面消息,这节课我们一起学习下如何接收消息. 我们在测试类中添加一个测试方法,如下图所示. 测试代码如下: @Testpublic void testQ ...

  2. 学习淘淘商城第八十一课(SSO 系统分析)

    一.什么是SSO系统? SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用 ...

  3. SSM分布式项目之淘淘商城-第十一天(IDEA)

    文章大纲 一.第十一天课程计划 二.校验数据接口开发 三.注册接口开发 四.登录接口开发 五.token的应用 六.登录注册功能实现 七.门户首页展示用户名(Jsonp) 八.参考博客 淘淘商城课程大 ...

  4. 关于淘淘商城面试的一些问题

    关于淘淘商城面试的一些问题 1.如果数据库的信息更改以后,那么索引库和缓存库里面的信息是怎么更新的?不可能每次都去访问数据库吧? 该问题前提是商品详情页面如果采取的是缓存商品数据这种设计的话,那么当商 ...

  5. python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  6. python网络编程知识_python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  7. 毕业设计学习锋迷商城的的笔记(自己设计并手写后台商品管理,分类管理,用户,地址管理系统,订单管理,微信支付(内网穿透))

    文章目录 自己添加的后端管理页面 视频演示效果 论文地址 后台代码视频实现讲解思路 1. 商品管理 2.商品分类管理 3.商品地址管理 4.权限管理系统 权限管理系统文章地址 5.订单管理 5.1 6 ...

  8. 毕业设计学习锋迷商城笔记

    文章目录 自己添加的后端管理页面 视频演示效果 1. 商品管理 2.商品分类管理 3.商品地址管理 4.用户中心管理 4. 用户权限管理 5.订单管理 6.商品品牌管理 锋迷商城项目 1.通过Mave ...

  9. (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)

    http://blog.csdn.net/u012453843/article/details/70184155 上节课我们一起学习了怎样解决KindEditor富文本编辑器上传图片的浏览器兼容性问题 ...

最新文章

  1. K - 老鼠走迷宫(DFS)
  2. windows查看进程线程的命令pslist
  3. 黄海广老师《机器学习》慕课第二轮1月14日开课了!
  4. SAP Spartacus SSR 模式下 index.html 页面渲染 fallback 到 CSR 之后的执行逻辑
  5. python训练模型测试模型_python 机器学习中模型评估和调参
  6. magento 获取产品存货量以及configurable product 下associated children product信息
  7. 简述static关键字、void与void *(void指针)、函数指针
  8. Windows远程桌面及其相关问题
  9. php++仿网页版微信,【原创】html5高仿微信网页版|h5仿微信聊天实战
  10. 什么是事实表和维度表?什么是维度和度量?
  11. 单片机与嵌入式linux 比较
  12. bos 文件上传-调研
  13. python3 爬取百合网的女人们和男人们
  14. 我在上海对日外贸公司的经历
  15. Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用
  16. Shell的解释和一些用法
  17. 【ModelMapper简单使用】
  18. 中国大学MOOC体育保健学考试试题及答案
  19. 无人机行业情况 - 亿航、大疆、极飞
  20. 配置ntp客户端与服务器端时间的同步

热门文章

  1. 域名注册使用,的坑。
  2. 2023年认证杯C题超详细思路配有实现代码
  3. 4G云音箱MP3版本铃声定制
  4. 使用CCS+XDS100V2在创龙DM3730开发板完成程序下载和调试
  5. FIDO与WebAuthn
  6. 【Python】09 数值内插
  7. Epson机械手程序开发(3)机械手报错时的处理
  8. Python爬取豆瓣排名报错参考——关键词:换行符|中文乱码|返回空值|正则问题
  9. C++变量名 命名规则
  10. 自动化测试 - 单元测试