javascript
SpringMVC之拦截器和异常处理
第四章 攔截器和異常處理
回顧
課前測:
本章內容
攔截器
異常處理
第一節:攔截器
javaWeb: 三大組件為servlet、filter 、listener
filter: 1.filter接口 2.實現這個接口的過濾器
應用:字符編碼過濾,登錄過濾,敏感字符過濾,日志記錄
listener:監聽器
1. SpringMVC攔截器的簡介
? Spring MVC中的攔截器(Interceptor),它主要用于攔截用戶請求并作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求信息的日志、判斷用戶是否登錄等。要使用Spring MVC中的攔截器,就需要對攔截器類進行定義和配置。
Filter過濾器:
Servlet中的過濾器Filter是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是設置字符集、控制權限、控制轉向、做一些業務邏輯判斷等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統一設置編碼,簡化操作;同時還可進行邏輯判斷,如用戶是否已經登陸、有沒有權限訪問該頁面等等工作。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。
Filter可以認為是Servlet的一種“加強版”,它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。Filter也可以對用戶請求生成響應,這一點與Servlet相同,但實際上很少會使用Filter向用戶請求生成響應。使用Filter完整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。
Filter有如下幾個用處
-
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
-
根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。
-
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
-
根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。
Filter有如下幾個種類。
-
用戶授權的Filter:Filter負責檢查用戶請求,根據請求過濾用戶非法請求。
-
日志Filter:詳細記錄某些特殊的用戶請求。
-
負責解碼的Filter:包括對非標準編碼的請求解碼。
-
能改變XML內容的XSLT Filter等。
-
Filter可以負責攔截多個請求或響應;一個請求或響應也可以被多個Filter攔截。
Interceptor攔截器:
? 攔截器只會攔截jsp之外的請求。.html
? 三層架構:表現成(jsp+Controller),持久層(pojo + dao),業務層(service==>在項目中的體現 在加一個包 service);
? 攔截器是在面向切面編程中應用的(AOP),就是在你的service或者一個方法前調用一個方法,或者在方法后調用一個方法。是基于JAVA的反射機制。攔截器,在AOP(Aspect-Oriented Programming)中用于在某個方法或字段被訪問之前,進行攔截,然后在之前或之后加入某些操作。攔截是AOP的一種實現策略。
SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,
? 第一種方式是要定義的Interceptor類要實現了Spring 的HandlerInterceptor 接口,或者是這個類繼承實現了HandlerInterceptor 接口的類,比如Spring 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;
? 第二種方式是實現Spring的WebRequestInterceptor接口,或者是繼承實現了WebRequestInterceptor的類。
2. 實現方式
springMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現的。
實現了Spring 的HandlerInterceptor 接口或者繼承實現了HandlerInterceptor 接口的(比如抽象類HandlerInterceptorAdapter )。
HandlerInterceptor 接口簡介
HandlerMapping
HandlerAdapter
HanderItercepter
HandlerInterceptor 接口中定義了三個方法,我們就是通過這三個方法來對用戶的請求進行攔截處理的。
(1)preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) :該方法將在請求處理之前進行調用。SpringMVC 中的Interceptor 是鏈式的調用的,每個Interceptor 的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor 中的preHandle 方法。該方法的返回值是布爾值Boolean類型的,當它返回為false 時,表示請求結束,后續的Interceptor 和Controller 都不會再執行;當返回值為true 時就會繼續調用下一個。
(2)postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法:是在當前請求進行處理之后,也就是Controller 方法調用之后執行,但是它會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進行操作。postHandle 方法被調用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執行
(3)afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法:將在整個請求結束之后,也就是在DispatcherServlet 渲染了對應的視圖之后執行。這個方法的主要作用是用于進行資源清理工作的
實現步驟:
-
配置文件配置
<!--配置攔截器--><mvc:interceptors><!--攔截器1--><mvc:interceptor><mvc:mapping path="/要攔截的請求路徑"/><mvc:exclude-mapping path="/放行路徑"></mvc:exclude-mapping><bean class="自定義攔截器的全限定名"></bean></mvc:interceptor><!--攔截器2--><mvc:interceptor><mvc:mapping path="/要攔截的請求路徑"/><mvc:exclude-mapping path="/放行路徑"></mvc:exclude-mapping><bean class="自定義攔截器的全限定名"></bean></mvc:interceptor></mvc:interceptors> -
自定義攔截器類實現HandlerInterceptor 接口
-
根據自己的需求詳細的實現preHandle方法
3.攔截器執行鏈
請求----》攔截器1 prehandle方法----》攔截器2的prehandle方法—》攔截器3的prehandle方法----》執行當前請求的controller中的方法----》攔截器3的posthandle方法----》攔截器2的posthandle方法----》攔截器1 posthandle方法—>
執行攔截器3afterCompletion方法–>執行攔截器2的afterCompletion方法–>執行攔截器1的afterCompletion方法–》結束!
4.攔截器登錄攔截案例
------>見課堂代碼 interceptor_exception項目。
第二節:統一異常處理
目的:就是讓客戶在使用程序期間,如果出現錯誤了,會有一個友好的頁面顯示,不會再出現大堆的 異常錯誤信息。
異常:程序運行期間,或者程序編碼期間可能出現的錯誤。
異常的繼承體系
? throwable : 異常的頂級父類
? Error:錯誤
? Exception: 異常
? RuntimeException:
? 空指針,類轉換,數組下標越界,算術。。。
? 非運行時:編譯期異常
? IO異常,格式化異常。。。sql異常
異常的處理:
? 拋出異常:
? throws 方法的尾部追加異常種類,s復數,肯定是方法后.
? 代碼中: throw new 異常種類(msg);
? 捕獲異常:
? try{ 可能出現異常的代碼} catch (異常的種類){打印異常信息} finally{一定會執行的代碼}。
自定以異常:
? 要求:所有的異常都要處于異常的繼承體系之下。
? 說明我們自己的異常要繼承已經存在的jdk內部的異常。一般繼承 Exception。
1.統一異常處理思路分析:
2.自定義異常類
package com.qy136.exception; /*** 自定義異常類要處于異常的繼承體系之下*/ public class ErrorException extends Exception{public ErrorException(){super();}public ErrorException(String message){super(message);} }改造Controller:
@RequestMapping("getUser")public String getUser() throws Exception{try {int a = 1/0;} catch (Exception e) {e.printStackTrace();throw new Exception("出錯了,請聯系管理員!1111");}return "success";}在第一步和第二步完畢之后,大家可以做個測試,這個測試是測試我們500的錯誤,500錯誤已經變成自己的Execption信息。
3.自定義異常處理器
在SpringMVC里面,叫HandlerExceptionResolver
package com.qy136.exception; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /*** 自定義異常處理器* 必須要實現這個接口* HandlerExceptionResolver*/ public class ErrorExceptionResolver implements HandlerExceptionResolver {/** * @param httpServletRequest* @param httpServletResponse* @param o* @param e 此參數 表示的就是異常處理器捕獲到的異常。* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {/*因為,此方法接收到的異常直接就是Exception父類異常,直接使用父類異常無法取出我們自己拋出的子類異常信息所以需要做一個強轉,將這個Exception 類型的e 轉換成我們自己拋出的ErrorException異常*/ErrorException exception;//判斷e是否是ErrorException子類異常,或者同類異常if(e instanceof ErrorException){exception = (ErrorException) e;}else{exception = new ErrorException("出錯了,請聯系管理員!2222");}//通過此ModelAndView對象,讓客戶端顯示一個友好的錯誤頁面ModelAndView mv = new ModelAndView();mv.setViewName("error");mv.addObject("msg",exception.getMessage());return mv;} }4.配置異常處理器
<!--配置異常處理器--> <bean id="唯一標識" class="自定義異常處理器的全限定名"></bean>不這樣是否可以???之前看到一些自定義的bean,都可以使用Spring注解托管,我們這里用的是
在第三步類前面加了個@Component。
5.觀察結果顯示
調試二
注意:原來出現異常之后,在頁面上用戶會看到一堆堆的500、404的錯誤信息,用戶體驗不好。我們可以自定義錯誤頁面信息,UI體驗效果會更好。
在登錄頁面,加異常處理.
異常處理器的全限定名">
不這樣是否可以???之前看到一些自定義的bean,都可以使用Spring注解托管,我們這里用的是在第三步類前面加了個@Component。#### 5.觀察結果顯示**調試二**注意:原來出現異常之后,在頁面上用戶會看到一堆堆的500、404的錯誤信息,用戶體驗不好。我們可以自定義錯誤頁面信息,UI體驗效果會更好。在登錄頁面,加異常處理.總結
以上是生活随笔為你收集整理的SpringMVC之拦截器和异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC第五次课 SSM整合
- 下一篇: Spring框架之权限管理