四、SpringMVC拦截器
1、拦截器HandlerInterceptor
-
SpringMVC中的拦截器类似于ServletAPI中的filter过滤器
-
实现步骤:
-
编写类继承HandlerInterceptor
@Component public class FirstInterceptor implements HandlerInterceptor { /** * 在控制器方法执行前执行 * return true : 放行 * return false : 拦截 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("在控制器方法执行前执行preHandle"); return true; } /** * 在控制器方法执行完执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("在控制器方法执行后执行postHandle"); } /** * 处理完视图和模型数据,渲染视图完毕之后执行afterComplation() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("视图跳转前执行afterCompletion"); } }
-
在springMVC的核心配置文件中配置
<!-- 配置拦截器--> <mvc:interceptors> <!-- 方式一:<bean class="day01.interceptor.FirstInterceptor"/> 会拦截全部的访问控制器的方法--> <!-- <bean class="day01.interceptor.FirstInterceptor"/>--> <!-- 方式二:<ref bean="firstInterceptor"/> 要求:拦截器要在容器里面,同样会拦截全部的访问控制器的方法--> <!-- <ref bean="firstInterceptor"/>--> <!-- 方式三:可根据情况定制需要拦截的请求 path="/**": 代表拦截全部访问控制器的方法--> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- <mvc:exclude-mapping path=""/> 可以设置不拦截的路径 --> <mvc:exclude-mapping path="/"/> <ref bean="firstInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
-
多个拦截器的执行顺序
- 每个拦截器的preHandle()都返回true时
- 拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关(配置在前先执行)
- preHandle()会按照配置的顺序执行,而postHandle() 和 afterComplation() 会按照配置的反序执行
- 若某个拦截器的preHandle()返回了false
- preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的afterComplation()会执行
- 每个拦截器的preHandle()都返回true时
2、异常处理Exception
-
SpringMVC提供了一个处理控制器方法执行过程中出现异常的接口:HandlerExceptionResolver
-
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver
-
自定义异常处理器SimpleMappingExceptionResolver
-
基于xml配置实现
<!-- 基于xml的异常处理--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 配置异常映射--> <property name="exceptionMappings"> <props> <!-- properties的键表示处理器方法执行过程中出现的异常--> <!-- properties的值表示出现指定异常后跳转的页面,会通过视图解析进行解析--> <prop key="java.lang.ArithmeticException">error</prop> </props> </property> <!-- exceptionAttribute将出现的异常信息在请求域中共享--> <property name="exceptionAttribute" value="ex"></property> </bean>
-
基于注解配置实现
@ControllerAdvice//标识这是一个异常处理的组件 public class ControllerException { //@ExceptionHandler用来指定该方法可以处理那些异常 @ExceptionHandler(value = {ArithmeticException.class}) public String controllerAdvice(Exception ex, Model model){//ex用来接收异常信息 //将异常信息存放到request域中 model.addAttribute("ex",ex); return "error";//跳转页面 } }
-