拦截器从功能的角度来讲和过滤器(Filter)类似,但有本质区别
FIlter是Servlet规范的一部分,能够拦截任意请求,常用于设置编码、登录验证等。
拦截器属于SpringMVC规范的一部分,只能拦截DIspatcherServlet拦截到的内容,一般拦截Controller,所以经常用于抽取公共代码。
使用方式
自定义拦截器实现HandlerInterceptor接口
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
/**
* 请求预处理,用于初始化操作
* 如果返回false:不再调用控制器的方法以及后面的postHandle、afterCompletion方法
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("preHandle-------");
return true;
}
/**
* Controller方法调用之后调用,在DispatcherServlet渲染视图之前调用
* 在这里对请求进行后续处理,比如设置请求头、使用modelAndView改变转发路径等
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle-------");
}
/**
* 在DispatcherServlet渲染视图之后调用
* 可以理解在response.getWriter().write()后调用或者在request.getRequestDispatcher().forward()转发
* 后调用再或者在response.sendRedirect()重定向之后调用
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion-------");
}
}
配置拦截器
<mvc:interceptors>
<!-- 可以配置多个拦截器-->
<mvc:interceptor>
<!-- 需要拦截的路径,包括子路径-->
<mvc:mapping path="/**"/>
<!-- 排查所有的html-->
<mvc:exclude-mapping path="/**/*.html"/>
<!-- 排查所有的png-->
<mvc:exclude-mapping path="/**/*.png"/>
<!-- 排查所有的jpg-->
<mvc:exclude-mapping path="/**/*.jpg"/>
<!-- 排查所有的js-->
<mvc:exclude-mapping path="/**/*.js"/>
<!-- 自定义的拦截器-->
<bean class="com.lff.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
这样就OK啦