首先通过实现HandlerInterceptor接口来创建一个拦截器类
这个接口一共有三个方法,preHandle是请求到controller之前执行的,只有返回true时请求才会继续进行
postHandle是返回modelAndView之前执行的,但是只有preHandle方法返回true后经过controller返回时才会执行,否则返回false则不会执行,afterCompletion是请求结束后才执行,同样需要preHandle返回true,该方法通常用于统一的日志处理,异常处理,资源清理等工作
package org.wcy.config;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* <p>Title : BaseHandlerInterceptor</p>
* <p>Description : 系统最高权限拦截器</p>
* <p>DevelopTools : Eclipse_x64_v4.8.0</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wangchenyang</p>
* @author : wangChenYang
* @date : 2018年11月25日 下午12:09:05
* @version : 12.0.0
*/
public class BaseHandlerInterceptor implements HandlerInterceptor {
/**
* 进入Handler方法之前执行
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param handler handler
* @return true(放行) or false(拦截)
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.print("before:");
return true;
}
/**
* 进入Handler方法之后,返回modelAndView之前执行(可以往MV里面填充公用的ModelAndView)
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param handler handler
* @param mv ModelAndView
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
throws Exception {
System.out.print("mv 执行:");
}
/**
* 执行Handler完成后执行(统一异常处理,统一日志处理)
*
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param handler handler
* @param e 异常信息
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)
throws Exception {
System.out.print("after:");
}
}
在SpringMVC中拦截器的实现可以通过配置xml文件内的mvc:interceptor标签来添加自定义的拦截器类,
而springboot没有xml。这个时候就需要通过继承WebMvcConfigurationSupport这个类来实现拦截器的添加了,
这个类就是我在上个文章内提到的用以配置静态文件的类,同时它也可以用以装载自定义拦截器。
addInterceptors用于指定拦截器,addPathPatterns用于指定拦截的URL,excludePathPatterns排除静态文件拦截
package org.wcy.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* <p>Title : MyWebMvcConfig</p>
* <p>Description : 自定义静态资源映射路径和静态资源存放路径</p>
* <p>DevelopTools : Eclipse_x64_v4.7.1</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wcy</p>
* @author : WangChenYang
* @date : 2018年11月14日 下午9:07:33
* @version : 0.0.1
*/
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurationSupport {
/**
* 添加自定义静态资源映射路径和静态资源存放路径(图片)
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println("配置静态资源");
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/WEB-INF/resources/");
super.addResourceHandlers(registry);
}
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
// excludePathPatterns排除静态文件拦截
registry.addInterceptor(new BaseHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/resources/**");
super.addInterceptors(registry);
}
}