spring boot 自定义拦截器
拦截器
spring拦截器类似于servlet的filter过滤器,用来拦截controller的请求过程。
定义拦截器
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器开始拦截");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器时");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器之后");
}
}
HandlerInterceptor 中有三个重载方法,分别对应着cottorller响应的三个生命周期:
preHandle
preHandle作用的地方是请求已经被RequestMapping分配到了不同的Controller里,但是还并未被Controller进行处理。
如果我们的目的是对登陆进行验证的话,那么这里就是我们主要的工作地点了。在这个过程里,我们可以验证用户的Cookie:
- 如果成功,则可以记录下当前User的信息,并且将这个信息保存到一个ThreadLocal的UserComponent里,方便以后的调用,并且将请求放行。
- 如果失败,则可以将请求通过response的sendRedirect函数重定向到登陆页面。
这里的返回值就是是否放行,如果不放行,那么客户端就收不到任何消息。显然我们一般都会放行。
postHandle
postHandle处理的是已经被Conttroller处理了,但是还未传递到网页模板进行渲染的时候。因此我们可以看到postHandle的参数比preHandle多了一个ModelAndView这个参数。这个参数其实就包括了Controller处理后需要传递给模板的那个Model参数。
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
afterCompletion
afterCompletion显然就是处理一些收尾工作了,他作用的地方就是在页面被渲染之后即将返回给用户的时候。这里通常是清除一些局部变量,比如清除掉在前面保存的ThreadLocal的本地信息。
配置拦截器
如果使用的boot版本是2.0以前的需要继承WebMvcConfigurationSupport
类,如果是2.0以后的则需要继承WebMvcConfigurerAdapter
这个类,因为在2.0以后WebMvcConfigurerAdapter
已经被弃用了。用WebMvcConfigurationSupport
替代。
import com.gimhon.springsample.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@SpringBootConfiguration
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
System.out.println("拦截器启动");
super.addInterceptors(registry);
}
}
注意:
- 这个拦截器只能拦截controller请求,普通的servlet无效。
spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法
参考:https://my.oschina.net/dengfuwei/blog/1795346
参考:https://blog.mythsman.com/2017/05/21/2/
推荐阅读
-
Spring Boot Maven 打包可执行Jar文件的实现方法
-
springboot 使用Spring Boot Actuator监控应用小结
-
Spring boot的上传图片功能实例详解
-
详解Spring Boot 异步执行方法
-
Spring Boot Security配置教程
-
Spring Boot应用Docker化的步骤详解
-
Spring Boot 配置MySQL数据库重连的操作方法
-
Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch的示例代码
-
Spring Boot中使用LDAP来统一管理用户信息的示例
-
详解使用Spring AOP和自定义注解进行参数检查