作用
类似于Servlet开发中的过滤器Filter,对于处理器进行预处理和后处理。
将拦截器按一定顺序组成一条链,这就是拦截器链。在访问被拦截的方法或字段,拦截器链中的拦截器就会按照其定义的顺序被调用。
拦截器是AOP思想的具体实现。
拦截器和过滤器的区别
过滤器
使用范围
是Servlet规范中的一部分,任何javaweb工厂都可以使用
拦截范围
在<url-pattern>中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器
使用范围
是SpringMVC框架自己的,只能在SpringMVC框架中才能使用
拦截范围
在<mvc:mapping path=“”/>中配置/**之后,也可以对所有资源进行拦截,但是可以通过<mvc:exclude-mapping path=“”/>标签排除不需要拦截的资源
快速入门
创建类来实现HandlerInterceptor接口
package xyz.nchu200462.utils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHandlerInterceptorl implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle running......");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle running......");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="xyz.nchu200462.utils.MyHandlerInterceptorl"/>
</mvc:interceptor>
</mvc:interceptors>
测试拦截器
package xyz.nchu200462.controller;
import com.sun.org.apache.xpath.internal.operations.Mod;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class myController {
@RequestMapping("/capkin")
@ResponseBody
public ModelAndView quickMethod(){
System.out.println("目标方法执行");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","capkin");
modelAndView.setViewName("index");
return modelAndView;
}
}
多拦截操作
package xyz.nchu200462.utils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHandlerInterceptorl2 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle running2......");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle running2......");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion2");
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="xyz.nchu200462.utils.MyHandlerInterceptorl"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="xyz.nchu200462.utils.MyHandlerInterceptorl2"/>
</mvc:interceptor>
</mvc:interceptors>
方法说明
preHandle()
方法将在请求处理之前调用,返回值是Boolean类型。返回false代表请求结束,后续的拦截器和控制层都不会执行。当返回为true,就会给下一个拦截器执行
postHandle()
在请求进行处理后被调用,前提是preHandle返回值为true,在DispatcherServlet进行视图返回渲染之前被调用。
在这个方法里面,可以对Cotroller处理好的视图ModelAndView对象进行操作
afterCompletion()
该方法在整个请求完成之后执行,前提是preHandle返回了true
放行
<mvc:exclude-mapping path="/user/login"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class="xyz.nchu200462.interceptor.PrivilegeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>