Spring-MVC中的拦截器
拦截器
(1)什么是拦截器?
DispatcherServlet收到请求之后,如果有拦截器,
会先调用拦截器,然后再调用处理器(Controller)。
注:
a.过滤器属于Servlet规范,而拦截器属于
Spring框架。
b.过滤器用于拦截Servlet容器的调用过程;
而拦截器由拦截DispatcherServlet的调用过程。
(2)如何写拦截器?
step1.写一个java类,实现HandlerInterceptor
接口。
step2.在接口方法当中,实现拦截处理逻辑。
step3.配置拦截器。(在Spring配置文件当中配置)。
(2)如何写拦截器?
step1.写一个java类,实现HandlerInterceptor
接口。
step2.在接口方法当中,实现拦截处理逻辑。
step3.配置拦截器。(在Spring配置文件当中配置)。
package interceptors;
/*
* 拦截器可以更改要发送出去的 ModelAndView 的内容,
*/
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SomeInterceptor implements HandlerInterceptor {
/**
* 这个方法在处理器执行之前执行,如果返回值为false,就不允许向后调用了
* 当DispatcherServlet收到请求之后,会先调用preHandle方法(首先被调用)
* 如果这个方法的返回值是true,会继续向后调用(向后调用其他拦截器或者处理器)
* 如果这个方法的反回值是false,则表示中断请求,返回结果(即不再向后调用了)
* handler 这个对象是处理器方法对象(可以利用java反射来获得处理器的方法特征
*/
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) //handler这个对象是处理器方法对象(可以利用java反射来获得处理器的方法特征)
throws Exception {
System.out.println("preHandle方法在最开始执行,如果true就执行下面的");
return true;
}
/**
* post:在--之后, handle :处理
* 当处理器方法已经执行完毕,正准备将处理结果返回DispatcherServlet(前端控制器)之前,会执行postHandle方法
* 注:
* 这里的modelAndView可以在该方法里面,修改处理结果。
*/
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
throws Exception {
System.out.println("postHandle()方法在最后之前执行!");
}
/**
* 最后执行的方法
* Exception ex 是处理器方法所抛出的异常
* 可以这个反法里面处理处理器所抛出的异常
*/
public void afterCompletion(
HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion()方法最后执行");
}
/*
* <!-- 在Sring—mvc中配置拦截器 ,当有多个拦截器,会按先后顺序依次执行-->
<!-- 这里有一点小坑要记住!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注:
当请求路径有多个/,应该使用/**来拦截
-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- /*并不是拦截所有,/**就是拦截所有了,没有/*** -->
<bean class="interceptors.SomeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
*/
}
运行结果:
preHandle方法在最开始执行,如果true就执行下面的
hello2的方法(前端控制器)
postHandle()方法在最后之前执行!
afterCompletion()方法最后执行