SpringMVC拦截器
一、开发步骤:
① 引入JAR文件
②定义拦截器类,实现HandlerInterceptor该接口,重写方法
注:preHandle()返回值是false
public class FirstInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("MyInterceptor.preHandle()"); return false; } @Override public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandl()"); } @Override public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("MyInterceptor.afterCompletion()"); }
下面对代码中的三个方法进行解释。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
③ 定义控制器方法
@Controller public class MyController { @RequestMapping("/first.do") public String doFirst(){ return "/index.jsp"; }
④Web.xml:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
⑤ 配置applicationContext.xml,自定义拦截器
控制台输出如下:
注:preHandle()返回值是true. 接到请求后,根据返回值类型判定,为true则执行第一个方法,
随后执行处理器方法。最后经过一系列执行返回客户端响应
⑥定义多个拦截器
注:在两个类的preHandler方法返回值为true的情况下:
执行流程如下:
注:当第一个拦截器类方法为true,第二个为false时,执行效果如下:
第一道为true,则继续执行,会执行到第二个拦截器的preHandler()。在这时,返回值是false,则不继续走控制器方法,
反之,不经过postHandler(),但会响应afterCompletion()。
注:若两个拦截器方法返回值都为false。
则只会执行第一个拦截器的方法。后续则都不执行