本文例程下载: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--