【SpringBoot】如何给Controller/RestController设置一个前置拦截器

本文例程下载:https://files.cnblogs.com/files/heyang78/redisCache_Interceptor_sample_210922.rar

本文适用SpringBoot版本:v2.5.4

有这样一个RestController类如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonCtrl {
    
    @RequestMapping("/sayhello")
    public String sayHello() {
        System.out.println("准备说你好");
        return "hello";
    }
}

这个类就是一般的Rest控制器类,直接用控制器类也是可以的,里面没有特殊设置。

如何给它设置前置拦截器呢,首先我们需要一个实现了HandlerInterceptor接口的拦截器类:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class Interceptor implements HandlerInterceptor{
    /**
     * 在请求处理之前进行调用(Controller/RestController方法调用之前)
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String path = request.getServletPath();
        System.out.println("已拦截 path="+path);

        // 执行权限检查、登录验证、缓存处理等
        
        return true;
    }
}

然后,我们需要一个实现了WebMvcConfigurer接口的WebConfig类把拦截器加载进来。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer{
    @Autowired
    private Interceptor interceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor);
    }
}

注意,registry.addInterceptor()方法可以添加多个拦截器,不限个数。

然后把启动类跑起来就好了。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

这个类没什么特别的。

内嵌的Tomcat运行起来后,我们可以在浏览器里输入http://localhost:8080/sayhello或是其它路径,然后到控制台去看拦截器是否按预期运转了。

2021-09-22 20:52:42.992  INFO 22764 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
已拦截 path=/sayHello
已拦截 path=/error
已拦截 path=/sayhello
准备说你好
已拦截 path=/21332
已拦截 path=/error

正如预期般运转,很好。

至此,一个RestController类的前置拦截器就搭建好了。

参考资料:https://www.cnblogs.com/itfeng813/p/13026652.html

--END--

原文地址:https://www.cnblogs.com/heyang78/p/15321715.html