- 作用:
类似于javaweb的filter,用来拦截控制器相关请求 - 解决问题:
日后可以将多个控制器方法中共同代码放入拦截器中执行从而减少controller中方法代码冗余。 - 拦截器特点
- 拦截器只能拦截器controller相关请求 不能拦截jsp以及静态资源相关请求。
- 请求先经过拦截器,控制器方法执行完成还会回到拦截器中继续执行拦截器中代码。
- 拦截器中断用户的请求轨迹
- 拦截器开发步骤
- 类 imprements HandlerInterceptor
//pre 预先处理
@Override
//参数1: 当前request对象 参数2:当前项目对象 参数3:当前请求控制器中方法对象
//返回值: true 放行请求继续执行 false 中断请求
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("=========1==========");
Object user = request.getSession().getAttribute("user");
if(user!=null){
return true;//放行
}else{
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
}
//post 过程中Handler
@Override
//参数1: 当前request对象 参数2:当前响应对象 参数3:当前请求控制器中方法对象 参数4:modelAndView 就是当前方法控制器的modelandView对象
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("=========3==========");
if(modelAndView!=null){
System.out.println("modelAndView:" +modelAndView);
modelAndView.addObject("date",new Date());
}
}
//after 后置 最后的处理
@Override
//参数1: 当前request对象 参数2:当前项目对象 参数3:当前请求控制器中方法对象 参数4:ex 当前控制器出现异常的异常对象
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("=========4==========");
System.out.println("异常信息:" + ex.getMessage());
}
- 配置拦截器,注册拦截器到springmvc
<!--注册拦截器-->
<bean class="com.baidu.interceptor.MyInterceptor" id="myInterceptor"></bean>
<!--配置拦截器的请求路径-->
<mvc:interceptors>
<mvc:interceptor>
<!--当前拦截器要拦截请求路径是谁,可以使用通配符 * 所有-->
<mvc:mapping path="/show/*"/>
<ref bean="myInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>