前言
springboot中interceptor的使用和spingmvc中使用模式差不多,都需要注册拦截器。首先需要继承HandlerInterceptor然后重写preHandle,postHandle和afterCompletion。本文演示使用拦截器拦截未登陆请求和在页面中便捷的获取baseUri
实现步骤
- 首先创建LoginInterceptor继承HandlerInterceptor并重写方法自定义处理逻辑
public class LoginInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getRequestURI().contains("api") || request.getRequestURI().contains("swagger")){
return true;
}
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login");
logger.info("拦截了" + request.getLocalAddr() + "的请求:" + request.getRequestURI());
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (modelAndView != null) {
if (!(modelAndView.getView() instanceof RedirectView)) {
String basePath = request.getContextPath();
modelAndView.addObject("basePath", basePath);
}
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
- 创建一个WebConfig配置class继承WebMvcConfigurerAdapter并重写方法
@Configuration
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter {
public WebConfig(){
super();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/");
super.addResourceHandlers(registry);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截规则:除了login,其他都拦截判断
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");
super.addInterceptors(registry);
}
}
小结
-
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现)返回值:true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
-
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
-
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。