15.SSM框架集~SpringMVC攔截器與異常處理

15.SSM框架集~SpringMVC攔截器

本文是上一篇文章的後續,詳情點擊該鏈接

攔截器

        Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter),它主要用於攔截用戶請求並作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求信息的日誌、判斷用戶是否登錄等

攔截器和過濾器的區別

在這裏插入圖片描述

        過濾器針對的是所有的請求,攔截器主要針對的是控制單元。過濾器基於技術是Servlet,攔截器是SpringMVC提供,攔截器可以看作是細化的過濾器,用攔截器可以實現的功能,過濾器幾乎都可以實現。但是過濾器可以實現的功能,攔截器不一定可以實現。

攔截器 過濾器
攔截器不依賴與servlet容器 過濾器依賴與servlet容器
攔截器只能對action請求起作用 而過濾器則可以對幾乎所有的請求起作用
攔截器可以訪問action上下文、值棧裏的對象 過濾器不能訪問
在action的生命週期中,攔截器可以多次被調用 過濾器只能在容器初始化時被調用一次
攔截器可以獲取IOC容器中的各個bean,在攔截器裏注入一個service,可以調用業務邏輯。 過濾器不怎麼行
要使用Spring MVC中的攔截器,就需要對攔截器類進行定義和配置。通常攔截器類可以通過兩種方式來定義。

        通過實現HandlerInterceptor接口,或繼承HandlerInterceptor接口的實現類(如HandlerInterceptorAdapter)來定義。

        通過實現WebRequestInterceptor接口,或繼承WebRequestInterceptor接口的實現類來定義。

代碼實現

本節代碼是接第13章的那篇後續
配置攔截器
    <!--  配置攔截器   -->
    <mvc:interceptors>
        <!--  定義攔截器配置   -->
        <mvc:interceptor>
            <mvc:mapping path="/loginUser/"/><!-- 用於指定對攔截的 url --> 
            <bean id="inter1" class="com.alvin.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

代碼實現

public class MyInterceptor  implements HandlerInterceptor {

    //執行時機:進入控制單元之前執行
    //如果方法返回值是true纔會繼續執行,如果是false 控制單元內容將不會執行
    // handler--com.alvin.controller.UserController#login(String, String, HttpServletRequest)
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //System.out.println("preHandle"+handler);
        //[作用一]進行中post文亂碼的處理
        request.setCharacterEncoding("utf-8");
        //[作用二] 維護頁面的跳轉
        //response.sendRedirect(request.getContentType()+"/wh.jsp");
        //[作用三]進行權限校驗/登錄攔截
        return true;
    }
    //執行的時機:在控制單元中做出相應之前 ,也就是在控制單元中第二步和第三步之間
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //[作用一]響應之前頁面跳轉的處理
        // modelAndView.setViewName("redirect:/success2.jsp");
        //[作用二] 對敏感詞語進行攔截替換
        Map<String, Object> model = modelAndView.getModel();
        //取出響應給客戶端數據
        String msg = (String) model.get("msg");
        if(msg.contains("槍支")){
            //替換成功以後的字符串
            String m2 = msg.replaceAll("棍棒", "**");

            model.put("msg",m2);
        }
        System.out.println("postHandle");
    }
    //執行的時機:頁面渲染後時候
    //垃圾回收的處理操作   資源關閉操作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

SpringMVC中異常處理

       系統中異常包括兩類:預期異常和運行時異常 RuntimeException,前者通過捕獲異常從而獲取異常信息, 後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。

       系統的 dao、service、controller 出現都通過 throws Exception 向上拋出,最後由 springmvc 前端控制器交由異常處理器進行異常處理,如下圖

在這裏插入圖片描述

使用@ExceptionHandler註解處理異常

假如我們現在就遇到一個異常,怎麼辦呢?

在這裏插入圖片描述

解決
//value指向的那個值就是我上面畫紅線的那個
    @ExceptionHandler(value = java.lang.NumberFormatException.class)
    public ModelAndView handlerArithmeticException(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/error.jsp");
        return modelAndView;
    }

@ExceptionHandler源碼

在這裏插入圖片描述

如果我們想要全局異常處理,那麼我們可以單獨創建一個包

在這裏插入圖片描述

//全局異常處理
@ControllerAdvice
public class GloableException {
    
    @ExceptionHandler(value = java.lang.NumberFormatException.class)
    public ModelAndView handlerArithmeticException(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/error.jsp");
        return modelAndView;
    }
}

然後在配置文件裏面多掃描一個就好了

  <context:component-scan base-package="com.alvin.controller,com.alvin.exception"></context:component-scan>

使用:SimpleMappingExceptionResolver


@Configuration
public class GloableException2 {
    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties prop = new Properties();
        prop.put("java.lang.NullPointerException","error1");
        prop.put("java.lang.ArithmeticException","error2");
        resolver.setExceptionMappings(prop);
        return resolver;
    }
}

自定義HandlerExceptionResolve

@Configuration
public class GloableException3 implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView mv = new ModelAndView();
        if(e instanceof NullPointerException){
                mv.setViewName("error1");
        }
        if(e instanceof ArithmeticException){
                mv.setViewName("error2");
        }
        mv.addObject("msg",e);
        return mv;
    }}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章