Spring MVC拦截器

使用场景

记录web请求的相关日志,可以做信息监控,统计,分析
检查web的访问权限,例如发现用户没有登录后,重定向到登录页面。
打开关闭数据库连接–预处理打开,后处理关闭,可以避免所有的业务方法中都编写相似的类。

Spring MVC的请求流程

Spring-MVC请求流程

HandlerInterceptor接口

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) throws Exception;
}

1.preHandle():预处理回调方法,若方法返回值为true,请求继续(调用下一个拦截器或处理器方法);若方法返回值为false,请求处理流程中断,不会继续调用其他的拦截器或处理器方法,此时需要通过response产生响应;
2.postHandle():后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时可以通过modelAndView对模型数据进行处理或对视图进行处理
3.afterCompletion():整个请求处理完毕回调方法,即在视图渲染完毕时调用

实例:用户登录检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
if (request.getSession().getAttribute(Constants.USER_SESSION_ATTR) != null) {
return true;
}
response.sendRedirect("/");
return false;
}
}

配置Interceptor

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/account/*").excludePathPatterns("/");
}
}