针对HandlerMapping的拦截器,由handlerMapping查找Handler后,将拦截器返回给前端控制器
配置拦截器
针对某一个HandlerMapping配置拦截器,
间接配置全局拦截器:让springmvc框架自动向每一个handlerMapping中注册拦截器。
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>//拦截所有请求
<bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
定义拦截器
public class HandlerInterceptor2 implements HandlerInterceptor{
//执行完Controller方法后执行。(modelAndView已经返回)
//统一异常处理,同一记录系统日志(日志要记录异常),用于action方法执行监控(可以计算出执行方法使用时间)
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
//进入handler方法后,使用modelAndView向页面传入通用数据,使用统一的view。
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
//进入handler方法之前执行,返回false表示拦截,反之放行
//用于用户身份的判断,用户权限拦截校验
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
return false;
}
}
两个拦截器都放行
HandlerInterceptor1..preHandle
HandlerInterceptor2..preHandle
HandlerInterceptor2..postHandle
HandlerInterceptor1..postHandle
HandlerInterceptor2..afterCompletion
HandlerInterceptor1..afterCompletion
结论:
preHandle是按照拦截器定义顺序执行,
postHandle和afterCompletion是按照拦截器定义逆向执行。
第一个放行第二个不放行
HandlerInterceptor1..preHandle
HandlerInterceptor2..preHandle
HandlerInterceptor1..afterCompletion
结论:
只要有一个拦截器不放行,action方法无法完成。
如果拦截器放行,afterCompletion才会执行。
只要有一个拦截器不放行,postHandle不执行。
两个都不放行
HandlerInterceptor1..preHandle
结论:
只要有一个拦截器不放行,action方法无法完成。
只要有一个拦截器不放行,postHandle不执行。
拦截器应用:
案例:用户身份认证拦截,用户登陆成功后,点击某些链接,可以在执行方法前去查找Session中是否有用户信息。校验用户身份是否合法,若是不合法,则跳转到用户登录页面。
取出请求的url,从request中取 String url = request.getRequestURI(); if(url.indexOf("login.action")>=0){...} 这样可以判断是哪个请求,便于拦截需要拦截的请求。
LoginAction.java(表示Controller)
@Controller
public class LoginAction {
@RequestMapping("/loginSubmit")
public String loginSubmit(HttpServletRequest request,String username,String password)throws Exception{
request.getSession().setAttribute("user", username);
return "redirect:items/showItems.action";
}
@RequestMapping("/loginOut")
public void loginOut(HttpServletRequest request){
request.getSession().invalidate();
}
}
HandlerInterceptor.java (中最核心的一部分)
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
String uri=arg0.getRequestURI();
if(uri.indexOf("loginSubmit.action")>=0){
return true;
}
if(arg0.getSession().getAttribute("user")!=null){
return true;
}
arg0.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(arg0, arg1);
return false;
}