Spring中的拦截器的作用
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
用户可以自己定义一些拦截器来实现特定的功能。
谈到拦截器,还要向大脚提一个词–拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
说到这里,那么拦截器与过滤器具体的区别是什么:
过滤器: 是servlet规范中的一部分,任何java web工程都可以使用。
拦截器: 是SpringMVC框架自己的,只使用了SpringMVC框架的工程才能用。
过滤器: 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器: 他是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
它也是AOP思想的具体应用。
我们要向自定义拦截器,要求必须实现:HandlerInterceptor接口。
步骤:
第一步: 编写一个普通的类实现HandlerInterceptor接口
package cn.itcast.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor1 implements HandlerInterceptor {
/*
* 预处理,controller方法执行前
* return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法
* return false不放行,
*
* */
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了。。。前处理方法2222");
// request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return true;
}
/*
* 后处理的方法,Controller方法执行后,在success执行之前
* */
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor执行了。。。后处理方法2222");
}
/*
* success.jsp方法执行后,该方法会执行
* */
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor执行了。。。最后处理2222");
}
}
第二步: 在前端控制器,springmvc…xml中配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<!--配置拦截器-->
<mvc:interceptor>
<!--要拦截的方法-->
<mvc:mapping path="/user/**"/>
<!--
不要拦截的方法
<mvc:exclude-mapping path=""/>
-->
<!--配置拦截器对象-->
<bean class="cn.itcast.Interceptor.MyInterceptor"/>
</mvc:interceptor>
<mvc:annotation-driven />
拦截器中的方法说明
public interface HandlerInterceptor {
/**
* 如何调用:
* 按拦截器定义顺序调用
* 何时调用:
* 只要配置了都会调用
* 有什么用:
* 如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去
* 进行处理,则返回 true。
* 如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* 如何调用:
* 按拦截器定义逆序调用
* 何时调用:
* 在拦截器链内所有拦截器返成功调用 * 有什么用:
* 在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,
* 在该方法中对用户请求 request 进行处理。
*/
default void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler,@Nullable ModelAndView modelAndView)
throws Exception { }
/**
* 如何调用:
* 按拦截器定义逆序调用
* 何时调用:
* 只有 preHandle 返回 true 才调用 * 有什么用:
* 在 DispatcherServlet 完全处理完请求后被调用,
* 可以在该方法中进行一些资源清理的操作。
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @
Nullable Exception ex) throws Exception {
}
}
思考:
如果有多个拦截器,这时拦截器 1 的 preHandle 方法返回 true,但是拦截器 2 的 preHandle 方法返 回 false,而此时拦截器 1 的 afterCompletion 方法是否执行?
拦截器的作用路径
作用路径可以通过在配置文件中配置。
<!-- 配置拦截器的作用范围 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 用于指定对拦截的 url -->
<mvc:exclude-mapping path=""/>
<!-- 用于指定排除的 url-->
<bean id="handlerInterceptorDemo1"
class="com.itheima.web.interceptor.HandlerInterceptorDemo1">
</bean> </mvc:interceptor>
</mvc:interceptors>