Java拦截器使用流程详解
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前执行
@Override
public 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处理完毕后、视图渲染前执行
@Override
public 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");
}
// 请求完全结束后执行(视图渲染完毕)
@Override
public 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 {
@Override
public 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 {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor()).order(1); // 先执行
registry.addInterceptor(new LogInterceptor()).order(2); // 后执行
}
}
浙公网安备 33010602011771号