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

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

       用户登录涉及到三个部分,第一部分是淘淘商城前台工程,第二部分是单点登录服务,第三部分是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 {
	@Autowired
	private TbUserMapper tbUserMapper;
    @Autowired	
	private JedisClient jedisClient;
    @Value("${USER_SESSION}")
    private String USER_SESSION;
    @Value("${SESSION_EXPIRE}")
    private Integer SESSION_EXPIRE;

	@Override
	public 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);
	}

	@Override
	public 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();  
	}

	@Override
	public 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,使用uuid
		String 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层代码便写完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值