热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

Springboot+Mybatis+redis+postman项目实战总目录*SpringBoot+Mybatis+PostMan(六):token登陆认证过程三(redis封装

Springboot+Mybatis+redis+postman项目实战总目录*

SpringBoot+Mybatis+PostMan(六):token登陆认证过程三(redis封装与干掉原来session,避免用户重复登陆)

番外篇:SpringBoot 用户注册时经MD5加密存入数据库

 

 

第二篇章:用户角色权限访问控制

 

SpringBoot+Mybatis+PostMan(七):用户角色权限访问控制入门(数据模拟实现,不带数据库)

 

SpringBoot+Mybatis+PostMan(八):用户角色权限访问控制一(数据库用户角色表查询组合)

 

SpringBoot+Mybatis+PostMan(九):用户角色权限访问控制二(加入资源表和资源角色对应表)

 

SpringBoot+Mybatis+PostMan(十):用户角色权限访问控制三(禁用session、启用token并集成redis)

 

 

继上一篇博文,接着嵌入redis缓存,其实在上一篇博文中,用COOKIE实现拦截比较的不容易,因为对于postman来说,我们在实现增删改查的时候已经对每个端口进行了访问,也都生成了其自己对应的token与COOKIE中,这样一来,我们设置的拦截器其实就形同虚设了,这时就需要创建一个全新的缓存用于存储token,用于存储redis,同时还要方便于访问,这样一来我们自然就想到了redis,这篇博文咱们就来介绍如何将redis嵌入springboot项目,同时实现token认证与登陆。

项目代码获取地址:https://github.com/yeyuting-1314/testdemo_redis_DM5_insert_page_token.git

一、 准备工作

需要的安装工具见网盘连接:

链接:https://pan.baidu.com/s/1Pkdnn8kfu6SZESEfYqFWkQ
提取码:nsdj 

1. 首先时redis的安装和配置,这里我们之前有写了十分详细的介绍,详情借鉴博文:https://www.cnblogs.com/yeyuting/p/14206888.html

2. redis安装好了后,为方便我们自己看redis缓存中中有哪些数据,我们安装一个redis可视化工具,安装包见上面的网页链接。

可视化工具安装步骤很简单,一直下一步即可,最后进入redis可视化页面,在“用户名”处填入“localhost”,测试一下连接,成功。

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 

 二、准备工作准备完毕,接下来接着前面代码继续修改。

1. 导入redis依赖

<dependency>
            <groupId>redis.clientsgroupId>
            <artifactId>jedisartifactId>
            <version>2.9.0version>
        dependency>

2.常量Constants类添加两个常量

/*
    * redis存储token设置的过期时间
    * */
    public static final Integer TOKEN_EXPIRE_TIME =60*2 ;
    /*
     * 设置可以重置token过期时间的时间界限
     * */
    public static final Integer TOKEN_RESET_TIME =1000*100 ;

3. 拦截器也要进行相关改进

@Override
    public boolean preHandle (HttpServletRequest request ,
                              HttpServletResponse response , Object o )throws Exception{
        //黑名单  有token  没有token
        //从request请求头里面获取
       // String token = tokenUtil.getToken(request) ; //检查请求中是否存在token , 如果不存在就直接跳转到登陆页面
        String token = request.getHeader("token") ;
        Jedis jedis = new Jedis("localhost" , 6379) ;

        if(StringUtil.isEmpty(token)){
            System.out.println("不存在token");
            response.sendRedirect("/login");
            return false ;
        }
        String username = "" ;
        username = jedis.get(token) ;
        System.out.println("redis中用户信息值为:" + jedis.get(token));

        if(username != null && !username.trim().equals("")){
            System.out.println("token值匹配成功!");
            Long tokenBirthTime = Long.valueOf(jedis.get(username+token)) ;
            Long diff = System.currentTimeMillis() - tokenBirthTime ;
            if (diff > Constants.TOKEN_RESET_TIME){
                jedis.expire(username , Constants.TOKEN_EXPIRE_TIME) ;
                jedis.expire(token , Constants.TOKEN_EXPIRE_TIME) ;
                System.out.println("token 有效时间成功更新");
                Long newBirthTime =System.currentTimeMillis();
                jedis.set(token+username , newBirthTime.toString()) ;
            }
            return true ;
        }
        response.sendRedirect("/login");
        return false ;

    }

4. controller层增加一个接口

@PostMapping("/loginWithRedis")
    @ResponseBody
    public  Result loginWithRedis(@RequestBody User user){
        Result result = userService.loginWithRedis(user) ;
        return result ;
    }

5. service层

public Result loginWithRedis(User user ) ;
public Result loginWithRedis(User user ){
        User user1 = userMapper.selectByName(user.getUserName()) ;
        if(user1 == null ){
            //response.sendRedirect("/login");
            return Results.failure("用户不存在,") ;
        }
        if(!user1.getPassword().equals(user.getPassword())){
            return Results.failure("密码输入错误") ;
        }
        Jedis jedis = new Jedis("localhost" , 6379) ;
        String token = tokenUtil.generateToken(user1) ;
        user1.setToken(token);
        jedis.set(user1.getUserName() , token) ;
        jedis.expire(user1.getUserName() , Constants.TOKEN_EXPIRE_TIME) ;
        jedis.set(token , user1.getUserName()) ;
        jedis.expire(token , Constants.TOKEN_EXPIRE_TIME) ;
        Long currentTime =System.currentTimeMillis() ;
        jedis.set(user1.getUserName()+token , currentTime.toString()) ;
        //用完关闭
        jedis.close();
        System.out.println("redis中token值为:" + jedis.get(user1.getUserName()));
        System.out.println("redis中用户信息值为:" + jedis.get(token));
        return Results.successWithData(user1) ;
    }

这样一来,代码逻辑部分就完成了,接下来是模拟前端部分

三、前端呈现。

 1. 如果对loginWithRedis端口进行拦截设置

拦截设置在MVCConfig类中设置:

@Override
    public void addInterceptors (InterceptorRegistry registry){
       registry.addInterceptor(authenticationInterceptor())
                //表示拦截所有请求
                .addPathPatterns("/*")
                //表示取消对特定路径的拦截
                .excludePathPatterns("/login")
                .excludePathPatterns("/loginCheck") ;
                //.excludePathPatterns("/loginWithRedis") ;
               //.excludePathPatterns("/selectOne")
                //这里一定不要写成/**/*.js的形式,spring boot无法识别
                //取消对static目录下静态资源的拦截
               // .excludePathPatterns("/static/**") ;
    }

前端模拟:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 这时显示结果是不让通行,并将其拦截到登陆页面。

2. 如果不拦截此接口:

拦截设置在MVCConfig类中设置:

 @Override
    public void addInterceptors (InterceptorRegistry registry){
       registry.addInterceptor(authenticationInterceptor())
                //表示拦截所有请求
                .addPathPatterns("/*")
                //表示取消对特定路径的拦截
                .excludePathPatterns("/login")
                .excludePathPatterns("/loginCheck") 
                .excludePathPatterns("/loginWithRedis") ;
               //.excludePathPatterns("/selectOne")
                //这里一定不要写成/**/*.js的形式,spring boot无法识别
                //取消对static目录下静态资源的拦截
               // .excludePathPatterns("/static/**") ;
    }

前端模拟如上,启动项目,postman前端显示如下:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 控制台显示如下:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 这时redis可视化界面显示如下:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 这样一来我们发现redis中已经存储好了wct对应的token值,将token值记录下来,下面我们要用此token值进行测试。

3. 在进行一次顺利的登陆后,再次拦截此端口,理想情况是用同样的信息登陆,这次能登陆进去(因为此用户已经登陆过一次,后面就不会被拦截了,即使我们对此端口进行了拦截,拦截方法中代码逻辑允许它通过)

拦截设置在MVCConfig类中设置:

@Override
    public void addInterceptors (InterceptorRegistry registry){
       registry.addInterceptor(authenticationInterceptor())
                //表示拦截所有请求
                .addPathPatterns("/*")
                //表示取消对特定路径的拦截
                .excludePathPatterns("/login")
                .excludePathPatterns("/loginCheck")
                //.excludePathPatterns("/loginWithRedis") ;
               //.excludePathPatterns("/selectOne")
                //这里一定不要写成/**/*.js的形式,spring boot无法识别
                //取消对static目录下静态资源的拦截
               // .excludePathPatterns("/static/**") ;
    }

前端进行模拟实现,在除了body中内容外,还要对header进行token值注入,以为我们在上面一种方法中返回给了前端postman对应的token值,需要前端人员将token值放到header中,但是我们并没有专门的前端人员进行前端数据处理,这样一来就需要我们自己手工加入里面,表示我们第一次已经访问了,并且也生成了token值,这时在拦截的方法中进行前端token值与redis中wct对应的token值匹配,匹配通过就给通过,匹配失败就拦截下来。

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 启动项目,访问端口,结果如下:

postman前端显示:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 控制台输出:

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

 

 这样一来,就完成了所有测试,redis也就完整的嵌入到了spring boot项目中。

至此,结束。 


推荐阅读
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • php用户注册与,fruit词组
    本文目录一览:1、PHP用户注册2、PHP怎么 ... [详细]
  • 动态多点××× 单云双HUB
    动态多点是一个高扩展的IPSEC解决方案传统的ipsecS2S有如下劣势1.中心站点配置量大,无论是采用经典ipsec***还是采用greoveripsec多一个分支 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • MySQL中如何使用MD5加密
    这篇文章主要介绍“MySQL中如何使用MD5加密”,在日常操作中,相信很多人在MySQL中如何使用MD5加密问题上存在疑惑,小编查阅了各式资料,整理出简 ... [详细]
author-avatar
yulongguxiang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有