首页 > 编程语言 >java springboot拦截器的实现及用法

java springboot拦截器的实现及用法

时间:2024-03-10 18:25:13浏览次数:34  
标签:拦截器 java springboot userLoginVo userId ThreadLocal static public redisTemplate

 

1.前景,有时候我们在不同的地方需要使用用户的信息,我们可以使用threadLocal存储信息,这样我们在在这个线程随时使用用户信息了,不用自己在写一段冗余代码了,这时候使用拦截器就很不错

 

2.实现

  1.实现HandlerInterceptor

  2.重写实现方法   preHandle:在业务处理器处理请求之前被调用 ​ postHandle:在业务处理器处理请求执行完成后 ​ afterCompletion:在完全处理完请求后被调用,可用于清理资源等

  3.创建配置类,配置拦截器需要拦截的路径

案例:

/**
 * @Author 
 * @Date 2024/3/10 17:45
* @desc 创建threadLocal存放数据 */ public class AuthContextHolder { private static ThreadLocal<Long> userId = new ThreadLocal<>(); //仓库id private static ThreadLocal<Long> wareId = new ThreadLocal<>(); private static ThreadLocal<UserLoginVo> userLoginVo = new ThreadLocal<>(); //后台管理用户id private static ThreadLocal<Long> adminId = new ThreadLocal<Long>(); //管理员基本信息 private static ThreadLocal<AdminLoginVo> adminLoginVo = new ThreadLocal<>(); public static Long getUserId(){ return userId.get(); } public static void setUserId(Long _userId){ userId.set(_userId); } public static Long getWareId(){ return wareId.get(); } public static void setWareId(Long _wareId){ wareId.set(_wareId); } public static UserLoginVo getUserLoginVo() { return userLoginVo.get(); } public static void setUserLoginVo(UserLoginVo _userLoginVo) { userLoginVo.set(_userLoginVo); } public static Long getAdminId() { return adminId.get(); } public static void setAdminId(Long _adminId) { adminId.set(_adminId); } public static AdminLoginVo getAdminLoginVo() { return adminLoginVo.get(); } public static void setAdminLoginVo(AdminLoginVo _adminLoginVo) { adminLoginVo.set(_adminLoginVo); } }

  创建拦截器,通过重写preHandle方法在调用方法前将数据放到线程中

public class LoginInterceptor implements HandlerInterceptor {

    private RedisTemplate redisTemplate;

    LoginInterceptor(RedisTemplate redisTemplate){
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            Long userId = JwtHelper.getUserId(token);
            UserLoginVo userLoginVo = (UserLoginVo) redisTemplate.opsForValue().get(RedisConst.USER_LOGIN_KEY_PREFIX + userId);

            if (userLoginVo != null) {
                AuthContextHolder.setUserId(userId);
                AuthContextHolder.setUserLoginVo(userLoginVo);
                AuthContextHolder.setWareId(userLoginVo.getWareId());
            }
        }

        return true;
    }
}

  具体拦截方法,可按需求拦截 

addPathPatterns需要拦截的方法。
excludePathPatterns排除在外的方法
public class LoginMvcConfigurerAdapter extends WebMvcConfigurationSupport {

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor(redisTemplate))
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/user/weixin/wxLogin/*");

        super.addInterceptors(registry);
    }
}

这样我们就可以在方法中随时通过调用threaLocal获取存在里面的用户信息

标签:拦截器,java,springboot,userLoginVo,userId,ThreadLocal,static,public,redisTemplate
From: https://www.cnblogs.com/gsyy/p/18064540

相关文章

  • Java登陆第三十四天——Node.js安装、npm配置、npm命令
    Nodejs是JS的运行环境,使JS可以运行在服务端,可以夸平台,可以运行在浏览器之外,成为一款全栈编程语言。Node.js安装Nodejs官网,进入......
  • 学java15结构
    1.顺序结构java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。2.选择结构if单选择结......
  • 手撕Java多线程(四)线程之间的协作
    线程之间的协作当多个线程可以一起去解决某个问题时,如果某些部分必须在其他部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的join()方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然b线程先启动,但是因为在b线程中调用了a线程的join......
  • java.net.UnknownHostException: api.weixin.qq.com解决办法
    java.net.UnknownHostException: api.weixin.qq.comat java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:175)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)at java.net.Socket.connect(Socket.java:546)at sun.security.ssl.SSLSo......
  • 学java14用户交互Scanner
    我们可以通过Scanner类来获取用户的输入基本语法Scanners=newScanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。程序实例packageScanner;importjava.util.Scann......
  • 学java13javaDoc生成文档
    找到类的地址,进入类所在文件夹,在导航栏中最前面添加“CMD(空格)”后回车javadoc-encodingUTF-8-charsetUTF-8文件名.java通过idea生成:tools/生成javadoc/第一步:选择生成JavaDoc文档的范围,我只对一个源文件生成Doc,所以选择文件。第二步:输出目录最好新建一个文件......
  • springboot3开发文档
    版本号jdk17springboot3mysql8.0mavenidea自带springboot依赖注入pom.xml命名规范:官方提供的场景:命名为:spring-boot-starter-*第三方提供场景:命名为:*-spring-boot-starter父工程坐标对各种常用依赖的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就......
  • 在Java中,HashMap中是用哪些方法来解决哈希冲突的?
    HashMap中调用hashCode()方法来计算hashCode。由于在Java中两个不同的对象可能有一样的hashCode,所以不同的键可能有一样hashCode,从而导致冲突的产生。采用链地址法解决冲突。HashMap底层是数组+链表+红黑树(JDK1.8)来实现的,根据key的hash值查找对应的位桶。1.当前索引数组为空,则......
  • Java学习笔记——第十一天
    面向对象高级(二)多态多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。多态的具体代码体现//使用同一个类名创建了不同类型的对象,体现了对象多态Peoplep1=newStudent();Peoplep2=newTeacher();//不同类型的对象调用了同一个名字的方法,体现了行为多态p1......
  • Java8新特性
    Java8新特性汇总Java8的改进速度更快代码更少(增加了新的语法:Lambda表达式)引入强大的StreamAPl便于并行最大化减少空指针异常:OptionalNashorn引擎,允许在JVM上运行JS应用并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。相比较串行的流,......