Spring MVC 中的 Interceptor 拦截器主要用来拦截用户的请求并进行相应的处理,比如用它来进行权限验证、判断是否登录等,实现方式有如下两种:
- 实现接口:org.springframework.web.servlet.HandlerInterceptor
- 继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter
拦截器实现:
1、实现 HandlerInterceptor 接口
public class DemoInterceptor implements HandlerInterceptor {/*** 在目标 Handler() 方法执行之前执行* 返回true,执行handler方法* 返回false,拦截,不执行handler方法** @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return false;}/*** 请求到达后,在目标handler()方法执行后,视图方法执行前做处理** @param request* @param response* @param handler* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}/*** 请求到达且视图生成后** @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}}
2、拦截器配置:
在 mvc.xml 中配置
<!-- 方式一 --><mvc:interceptors><!--使用bean定义一个Interceptor直接定义在mvc:interceptors根下面的Interceptor将拦截所有请求--><bean class="com.example.interceptors.DemoInterceptor"/></mvc:interceptors><!-- 方式二(推荐) --><mvc:interceptors><!--定义在 mvc:interceptor 下,自定义需要拦截的请求如果存在多个拦截器满足处理的要求,依据配置顺序先后执行--><mvc:interceptor><!-- 通过mvc:mapping配置需要拦截的资源,支持统配符,可配置多个,/**表示拦截所有请求 --><mvc:mapping path="/**" /><!-- 通过mvc:exclude-mapping 配置不需要拦截的资源,支持通配符,支持多个 --><mvc:exclude-mapping path="/login/**"/><bean class="com.example.interceptors.DemoInterceptor"/></mvc:interceptor></mvc:interceptors>
或在 java 配置类中进行配置:
@Configuration@ComponentScan(basePackages = {"com.example"}, useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {// 实现WebMvcConfigurer并覆写addInterceptors接口@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/**");}}
