1.实现拦截器接口
创建一个类实现HandlerInterceptor接口(Spring MVC)或框架对应的拦截器接口,重写关键方法
如下:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LogInterceptor implements HandlerInterceptor {// 请求到达Controller前执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("请求开始: " + request.getRequestURI());request.setAttribute("startTime", System.currentTimeMillis());return true; // 返回true继续执行,false终止请求}// Controller处理完毕后、视图渲染前执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {long startTime = (Long) request.getAttribute("startTime");System.out.println("请求处理耗时: " + (System.currentTimeMillis() - startTime) + "ms");}// 请求完全结束后执行(视图渲染完毕)@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("请求结束");}
}
2.注册拦截器
将拦截器添加到Spring MVC配置中,指定拦截路径和排除路径
一般有两种方式
1:java配置类(推荐)
注意:
在下面的addInterceptors方法中,可以多次调用registry.addInterceptor()来注册多个拦截器.每个拦截器都可以独立配置自己独立的拦截路径和排除规则,并且可以指定执行顺序
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**") // 拦截所有路径.excludePathPatterns("/static/**"); // 排除静态资源}
}
2:使用XML配置
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/static/**"/><bean class="com.example.LogInterceptor"/></mvc:interceptor>
</mvc:interceptors>
3:控制拦截器执行顺序
当有多个拦截器 ,可以通过Order注解或实现Ordered接口指定顺序
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).order(1); // 先执行registry.addInterceptor(new LogInterceptor()).order(2); // 后执行}
}