前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring boot redis +mysql实现登录功能

Spring boot redis +mysql实现登录功能

作者头像
雷子
发布2021-03-15 16:14:40
1.4K0
发布2021-03-15 16:14:40
举报
文章被收录于专栏:雷子说测试开发

在前面的文章中呢,我们介绍了spring boot 集成Druid,集成了mysql ,在实际的开发过程中呢,我们还需要利用redis 做一些缓存之类的数据,怎样去链接redis呢,本篇文章给大家讲解下,首先呢,我们还是需要去配置对应的库的。在我们的pom.xml去配置我们的redis。

代码语言:javascript
复制
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

然后去会自动的去下载对应的库,那么我们还需要在application.yaml配置,如下配置

代码语言:javascript
复制
  redis:
    port: 6379
    host: 127.0.0.1
    jedis:
      pool:
        max-active: 1000
        min-idle: 200
    timeout: 1000

链接的端口呢 是6379,链接的host 是redis的host,超时是1000, 最大活跃是1000 。这样配置好了,就完成了最简单的操作,这样是就可以链接到我们的redis了,当然不能啊,你还要启动你的 redis的服务呢,不启动是没有办法链接的,那么我们可以利用之前学的docker 去搭建我们的redis的服务。

搜索后,我们运行docker pull redis,下载镜像。

下载完毕,输入

代码语言:javascript
复制
docker images

查看本地的镜像。

然后去启动我们的镜像

代码语言:javascript
复制
docker run -itd --name redis -p 6379:6379 redis

这样就可以启动我们的redis的实例。我这里呢,打开界面管理工具,就链接到了redis 上面,

因为我这里的redis最近在使用,所以大家会看到有数据的。

那么我们在Springboot 怎么使用redis 呢。

代码语言:javascript
复制
@Autowired
private RedisTemplate redisTemplate;

首先呢,我们去加载这个,然后我们要制定我们redis的库,所以进行简单的封装。

代码语言:javascript
复制
 private RedisTemplate userredis(RedisTemplate redisTemplate) {
        redisTemplate = RedisDbInit.initRedis(2, redisTemplate);
        return redisTemplate;
    }

那么我们这样就完成了封装,接下来就是操作了,我这里还是去实现用户的登录,这里呢,对用户登录错误密码输入固定的时间超时后呢,我们就对用户进行禁止登录。

代码语言:javascript
复制
 @Override
    public UserVo login(String username, String password) {
        Instant inst1 = Instant.now();
        /*根据邮箱或者用户名登录*/
        User user = userRepository.findByUsername(username);
        //查询,用户是否存在
        if (user != null) {
            UserVo userVo = login_is(user, password, username);
            Instant inst2 = Instant.now();
            System.out.println("登录接口内部耗时:" + Duration.between(inst1, inst2).toMillis());
            return userVo;
        } else {
        //查询邮箱,支持邮箱登录
            User useremail = userRepository.findByEmail(username);
            if (useremail != null) {
            //存在,调用封装好d的方法
                UserVo userVo = login_is(useremail, password, username);
                return userVo;
            }
        }
        throw new PanExection(ResultEmus.USER_NOT_EXIT);
    }
代码语言:javascript
复制
if (user.getStatus().equals(UserEmus.DELETE.getCode())) {
            throw new PanExection(ResultEmus.USER_DELETE);
        }
        //判断用户密码是否正确
        Boolean b;
        try {
            b = MD5Until.checkoutpassword(password, user.getPassword());
        } catch (Exception e) {
            throw new PanExection(ResultEmus.EXCEPTIONS);
        }
        if (b) {
            //密码正确
            Date date = new Date();
            String tokne;
            //token生产
            try {
                tokne = MD5Until.md5(user.getUsername() + date.toString());
            } catch (Exception e) {
                log.error("登录产生token时候失败!原因是:" + e.getMessage());
                throw new PanExection(ResultEmus.EXCEPTIONS);
            }
            UserVo userVo = new UserVo();
            userVo.setId(user.getId());
            userVo.setEmail(user.getEmail());
            userVo.setToken(tokne);
            userVo.setUsername(user.getUsername());
            //存储token
            String token = user.getUsername() + "_" + tokne;
            userredis(redisTemplate).opsForValue().set(username, token, 1, TimeUnit.DAYS);
            useridport(redisTemplate).opsForValue().set(user.getUsername(), user.getId().toString(), 1, TimeUnit.DAYS);
            return userVo;
        } else {
            //密码不正确,判断是否有错误的存在,有,累加,
            String reslut = (String) userredis(redisTemplate).opsForValue().get("login_" + user.getId().toString());
            if (reslut == null) {
                userredis(redisTemplate).opsForValue().set("login_" + user.getId(), "1", 10, TimeUnit.MINUTES);
                throw new PanExection(ResultEmus.USER_ERROR_PASSWORD);
            } else {
                if (4 < Integer.parseInt(reslut)) {
                    throw new PanExection(ResultEmus.USER_FREE);
                } else {
                    Integer num = Integer.parseInt(reslut) + 1;
                    userredis(redisTemplate).opsForValue().set("login_" + user.getId(), (num.toString()), 10, TimeUnit.MINUTES);
                    throw new PanExection(ResultEmus.USER_ERROR_PASSWORD);
                }
            }

        }

备注,PanExection代码如下

代码语言:javascript
复制
@Getter
public class PanExection extends RuntimeException {
    private Integer code;

    public PanExection(ResultEmus resultEmuns) {
        super(resultEmuns.getMessage());
        this.code = resultEmuns.getCode();
    }

    public PanExection(CaseResultEmus resultEmuns) {
        super(resultEmuns.getMessage());
        this.code = resultEmuns.getCode();
    }

    public PanExection(Integer code, String message) {
        super(message);
        this.code = code;
    }
}

对一场进行处理。完成上述的开发呢,我们可以写一个接口来测试下。

代码语言:javascript
复制
@ApiOperation(value = "登录", notes = "用户登录")
    @PostMapping(value = "/login", produces = "application/json")
    public ResultVO login(@Valid UserForm userForm,
                          BindingResult bindingResult,
                          HttpServletRequest httpServletRequest) {
        if (bindingResult.hasErrors()) {
            throw new PanExection(ResultEmus.PARM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage());
        }
        UserVo login = userSerice.login(userForm.getUsername(), userForm.getPassword());
       if(login!=null){
       return ResultVOUntils.success("ok");
       }
       return ResultVOUntils.error(1, "密码或者用户名错误");
       }
代码语言:javascript
复制
ResultVOUntils
public class ResultVOUntils {
    public static ResultVO success(Object object) {
        ResultVO resultVO = new ResultVO();
        resultVO.setData(object);
        resultVO.setMsg("成功");
        resultVO.setCode(0);
        return resultVO;
    }

    public static ResultVO success() {
        return success(null);
    }

    public static ResultVO error(Integer code, String msg) {
        ResultVO resultVO = new ResultVO();
        resultVO.setCode(code);
        resultVO.setMsg(msg);
        return resultVO;
    }

    public static ResultVO error(Object object) {
        ResultVO resultVO = new ResultVO();
        resultVO.setData(object);
        resultVO.setMsg("失败");
        resultVO.setCode(1);
        return resultVO;
    }
}

这样就可以在本地,启动我们的服务,去测试我们功能是否可以正常。测试下

那么我们看redis 有没有存储上去呢,打开redis 查看下。

这样我么在spring boot +redis 就实现完毕了,我们还可以在缓存中使用。本人只是介绍了一个小功能。利用redis 来存储错误次数,在规定时间内输入错误 就标记失败,我们还可以查看redis key的过去时间。

代码语言:javascript
复制
SELECT 2  切换数据
pttl    查看key的过期时间

后续的文章还会持续介绍spring boot 的相关文章,后续可以持续关注。雷子说测试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档