jsp登录功能的实现_Spring boot redis +mysql实现登录功能

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

 org.springframework.boot            spring-boot-starter-data-redis            2.2.2.RELEASE

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

  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的服务。

4575148b9eb199764d6b3e9e46deceaa.png

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

下载完毕,输入

docker images

查看本地的镜像。

10c7904f6e6e73de15b0068155722d2c.png

然后去启动我们的镜像

docker run -itd --name redis -p 6379:6379 redis

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

eb0b2a4a7380702c33e72e537a41af75.png

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

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

@Autowiredprivate RedisTemplate redisTemplate;

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

 private RedisTemplate userredis(RedisTemplate redisTemplate) {        redisTemplate = RedisDbInit.initRedis(2, redisTemplate);        return redisTemplate;    }

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

 @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);    }
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代码如下

@Getterpublic 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;    }}

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

@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, "密码或者用户名错误");       }
ResultVOUntilspublic 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;    }}

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

2c01a37f6c98ea3f55975cd3cec2eb6f.png

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

3fff80f9354fd3c617bb285d8c235d2c.png

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

SELECT 2  切换数据pttl    查看key的过期时间
2c2507ac7d95a6e42e6b1f003ede5732.png

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

68f1f3e6a4cf4a921a3609e3f7cf429c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值