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
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
/**
* 请求到达后,在目标handler()方法执行后,视图方法执行前做处理
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 请求到达且视图生成后
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public 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)})
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// 实现WebMvcConfigurer并覆写addInterceptors接口
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new DemoInterceptor()).addPathPatterns("/**");
}
}