# SpringMVC攔截器和異常處理機制 ## 概念 SpringMVC攔截器類似於過濾器,用於進行預處理和後處理 將攔截器按照一定順序連接成一條鏈,就是攔截器鏈 ## 攔截器和過濾器區別 ![](https://img2023.cnblogs.com/blog/2844064/202307/28 ...
SpringMVC攔截器和異常處理機制
概念
SpringMVC攔截器類似於過濾器,用於進行預處理和後處理
將攔截器按照一定順序連接成一條鏈,就是攔截器鏈
攔截器和過濾器區別
攔截器的快速入門
-
創建攔截器類實現HandlerInterceptor介面
-
配置攔截器
<!-- 配置攔截器--> <mvc:interceptors> <mvc:interceptor> <!-- 對那些資源執行攔截操作,這是對所有資源執行--> <mvc:mapping path="/**/"/> <bean class="com.myspring.interceptor.MyHandlerInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
-
測試攔截器的攔截效果
package com.myspring.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyHandlerInterceptor implements HandlerInterceptor { // 覆蓋三個方法 //在目標方法(控制類中對應方法)執行前執行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String param = request.getParameter("param"); if("yes".equals(param)){ // 返回值為false不放行,true放行 return true; } else { request.getRequestDispatcher("/error.js").forward(request,response); return false; } } //在目標方法執行之後,視圖返回之前執行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { modelAndView.addObject("name","xiaoming"); } //在整個流程都執行完畢後執行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
三個方法的執行:在配置文件中依次配置兩個攔截器分別為1和2,則執行順序是:1的 preHandle >2的preHandle>2的postHandle>1的postHandle>2的afterCompletion>1的afterCompletion
SpringMVC異常處理機制
如圖:
異常處理的兩種方式:
- 使用springmvc通過的簡單異常處理器SimpleMappingExceptionResolver
- 使用Spring的異常處理介面HandlerExceptionResolver自定義自己的異常處理器
SimpleMappingExceptionResolver
主要需要進行相應異常與視圖的映射配置
在springmvc的配置文件中:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 預設錯誤頁面-->
<property name="defaultErrorView" value="error"/>
<property name="exceptionMappings">
<map>
<entry key="java.lang.ClassCastException" value="error1"/>
<entry key="java.lang.ClassNotFoundException" value="error2"/>
</map>
</property>
</bean>
HandlerExceptionResolver自定義異常處理器
-
創建異常處理器類實現HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver { @Override //參數Exception是異常對象,返回值是你要跳轉的錯誤頁面 public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); if(e instanceof Exception){ } modelAndView.setViewName("error.jsp"); return modelAndView; } }
-
配置異常處理器
<bean class="com.myspring.domain.MyExceptionResolver"/>
-
編寫異常頁面