Spring MVC框架中,拦截器是可以运行在所有控制器处理请求之前或之后的一种组件,拦截器拦截下来执行其他代码或者阻止代码运行。解决的问题典型代表就是验证用户是否已经登录。
使用拦截器可以自定义类实现HandlerInterceptor接口。
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor.preHandle()");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor.postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginInterceptor.afterCompletion()");
}
}
每个拦截器必须注册才会被启用,注册过程通过重写WebMvcConfigurer接口中的addInterceptors()方法即可。
@Configuration
@EnableWebMvc
@ComponentScan("springmvc")
public class SpringMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/login.do");
}
}
浏览器显示
控制台显示
当把preHandle()返回值改为true,在Tomcat控制台可以看到依次执行了preHandle()、控制器中处理请求的方法、postHandle()、afterCompletion()。
preHandle()方法的返回值为true表示放行,false表示阻止。
addPathPatterns()方法拦截路径。
excludePathPatterns()方法排除拦截的路径。