Spring Boot自定义Interceptor
程序员文章站
2022-05-23 10:45:28
...
1.定义Interceptor
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/**
SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。
每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,
所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,
也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。
该方法的返回值是布尔值Boolean类型的,当它返回为false 时,
表示请求结束,后续的Interceptor 和Controller 都不会再执行;
当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,
如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
**/
System.out.println("starttime----"+new Date().getTime());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
/**
由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion
方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。
postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,
但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller
处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,
也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。
Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方
法来触发对下一个Interceptor 或者是Action 的调用,
然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,
而invoke 方法之后的内容就是反向的
**/
System.out.println("开始执行----postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
/*
该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,
也就是在DispatcherServlet 渲染了对应的视图之后执行。
这个方法的主要作用是用于进行资源清理工作的。
*/
System.out.println("endtime----"+new Date().getTime());
}
}
2. 注册interceptor
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 WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**其中addInterceptor方法用于把刚才创建的拦截器加入到registry中,addPathPatterns用
户加入所要拦截的url,/**表示拦截所有请求。excludePathPatterns添加不需要拦截的请
求。 至此,一个拦截器就配置好了。如果需要配置多个拦截,只需要另外创建一个拦截器,给
registry再加一个inteceptor就可以了,不用再创建一个新的config配置类。
**/
registry.addInterceptor(new TimeInterceptor())
.addPathPatterns("/person.html","/Person.html",
"/questionnaire.html","/Questionnaire.html",
"/result.html","/Result.html");;
}
}
参考链接:https://blog.csdn.net/weixin_39881983/article/details/86588318
推荐阅读
-
255.Spring Boot+Spring Security:使用md5加密
-
Spring Boot+Spring Security:获取用户信息和session并发控制
-
spring boot 动态生成接口实现类的场景分析
-
Spring boot配置 swagger的示例代码
-
Spring Boot整合Druid配置多数据源
-
Spring Boot使用@Scheduled 实现定时任务
-
Java Maven:spring boot + Mybatis连接MySQL,通用mapper的增删改查,映射实现多表查询
-
Spring Boot 设置项目名后静态文件相对路径问题
-
spring boot 和nginx两种跨域处理(已验证)
-
spring boot 引入模板