spring MVC中的拦截器是非常重要的,他的主要作用是拦截用户 的请求并进行相应的处理,,例如权限验证,或者判断用户是否登录
使用拦截器有两种方式,第一种是定义Interceptor实现类,第二种是实现HandlerInterceptor
springMVC中的interceptor拦截请求是通过handlerinterceptor来实现的。在springmvc中定义 一个interceptor非常简单,主要有两种方式,第一种是定义一个interceptor类,要实现spring的HandlerInterceptor接口,或者也可以实现继承实现了handlerInterceptor接口的类,第二种方式是实现了spring的WebRequestInterceptor接口
第二种方式是实现了HandlerIntercepter接口,这个接口中定义了三个方法,我们就是通过这三个方法来控制拦截的,
package cn.mvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class TestInterceptor implements HandlerInterceptor {
/**
* 只有preHandle返回true才会被执行
* 在视图解析器执行后执行
* 一般用于清理工作
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("after completion");
}
/**
* preHandle执行后返回true才能执行
* 此方法在处理器执行后,数据模型被渲染前执行
* 一般可用于处理数据模型需要注意的是preHandle先调用,那么postHandle就会被后调用
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("post------");
}
/**
* 在处理器执行前执行会返回一个boolean值,只有返回true才可以执行下一个拦截器,或处理器方法,false不继续执行
* 一般进行初始化动作
*/
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
// 拿到请求路径进行判断
String uri = req.getRequestURI();
if(uri.endsWith("login")){
System.out.println("woshi yi1111");
return true;
}
if(req.getSession().getAttribute("name")!=null){
return true;
}
req.getRequestDispatcher("login.jsp").forward(req, resp);
return true;
}
}
prehandle(HttpServletRequest request, HttpServletResponse response, Object handle)该方法是在请求处理之前进行调用的,在一个springMVC中可以存在多个interceptor,每个都会有一个prehandle
postHandle()这个方法是在prehandle方法返回true的时候执行的,postHandle在处理器执行后。在数据模型被渲染前执行
一般可以用于处理数据模型,需要注意 的是prehandle 先调用,它就会后调用
afterCompletion(),他是最后执行的,同上,它也是等到prehandler返回true的时候才会调用,一般用于清理工作
实现上面的方法还要配置文件
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hello.do"/>
<bean class="cn.bjsxt.interceptor.MyInterceptor"></bean>
</mvc:interceptors>
最后说一下多拦截器的执行顺序
A(preHandle)—> B(preHandle) –> controller –> B(postHandle) –> A(postHandle)—> View –> B(afterCompletion) –> A (afterCompletion)