概述
Spring MVC的拦截器分为三种:访问controller前,访问controller后,页面渲染后。所有的拦截器都实现HandlerInterceptor
接口,接口中包含三个类别的方法。也就是每个拦截器都会进行三次拦截处理。
多个拦截器的执行顺序
- postHandle按拦截器配置的逆序调用;
- postHandler按拦截器配置的逆序调用;
- afterCompletion按拦截器配置的逆序调用;
- postHandler在拦截器链内所有拦截器返成功调用;
- afterCompletion只有它的preHandle返回true才调用。
至于为什么是这样,我也不清楚,还没读Spring MVC源码,等之后知道原理后会更新博文。
应用
<mvc:interceptors>
<mvc:interceptor>
<!-- 现在是所有访问请求都会被拦截
如果想拦截指定路径的请求,可以采用的方式如:/user/**
-->
<mvc:mapping path="/**"/>
<bean class="com.first.mvc.MyInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle");
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
System.out.println("preHandle");
if(req.getParameter("name") != null)
return true;
return false;
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyFirst {
@RequestMapping(value="/first.action")
public ModelAndView first() {
ModelAndView mv = new ModelAndView();
System.out.println("第一次使用springmvc");
mv.setViewName("newFile");
return mv;
}
}
案例
登陆之后才能访问其他功能,否则会被拦截到登陆界面。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
HttpSession session = request.getSession();
String uri = request.getRequestURI();
// 判断username是否为null
if(!uri.contains("/login")){
Object username = session.getAttribute("username");
if(username == null){
response.sendRedirect(request.getContextPath() + "/user/toLogin.action");
return false;
}
}
return true;
}