1. 程式人生 > >SpringBoot中實現攔截器, 並實現對404和500等錯誤的攔截。

SpringBoot中實現攔截器, 並實現對404和500等錯誤的攔截。

今天給大家介紹一下SpringBoot中攔截器的用法,相比Struts2中的攔截器,SpringBoot的攔截器就顯得更加方便簡單了。

只需要寫幾個實現類就可以輕輕鬆鬆實現攔截器的功能了,而且不需要配置任何多餘的資訊,對程式設計師來說簡直是一種福利啊。

廢話不多說,下面開始介紹攔截器的實現過程:

第一步:建立我們自己的攔截器類並實現 HandlerInterceptor 介面。 

package example.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定義攔截器1
 *
 * @author   林志強(208017534)
 * @myblog    www.wolzq.com
 * @create    2016年9月20日
 */
@Controller
public class ErrorInterceptor implements HandlerInterceptor {

	/** 
     * preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行呼叫,SpringMVC中的Interceptor攔截器是鏈式的,可以同時存在 
     * 多個Interceptor,然後SpringMVC會根據宣告的前後順序一個接一個的執行,而且所有的Interceptor中的preHandle方法都會在 
     * Controller方法呼叫之前呼叫。SpringMVC的這種Interceptor鏈式結構也是可以進行中斷的,這種中斷方式是令preHandle的返 
     * 回值為false,當preHandle的返回值為false的時候整個請求就結束了。 
     */  
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
		System.out.println(">>>MyInterceptor1>>>>>>>在請求處理之前進行呼叫(Controller方法呼叫之前)");
        return true;// 只有返回true才會繼續向下執行,返回false取消當前請求
    }

	/** 
     * 這個方法只會在當前這個Interceptor的preHandle方法返回值為true的時候才會執行。postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之 
     * 後,也就是在Controller的方法呼叫之後執行,但是它會在DispatcherServlet進行檢視的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操 
     * 作。這個方法的鏈式結構跟正常訪問的方向是相反的,也就是說先宣告的Interceptor攔截器該方法反而會後呼叫,這跟Struts2裡面的攔截器的執行過程有點像, 
     * 只是Struts2裡面的intercept方法中要手動的呼叫ActionInvocation的invoke方法,Struts2中呼叫ActionInvocation的invoke方法就是呼叫下一個Interceptor 
     * 或者是呼叫action,然後要在Interceptor之前呼叫的內容都寫在呼叫invoke之前,要在Interceptor之後呼叫的內容都寫在呼叫invoke方法之後。 
     */  
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
		System.out.println(">>>MyInterceptor1>>>>>>>請求處理之後進行呼叫,但是在檢視被渲染之前(Controller方法呼叫之後)");
        if(response.getStatus()==500){
            modelAndView.setViewName("/errorpage/500");
        }else if(response.getStatus()==404){
            modelAndView.setViewName("/errorpage/404");
        }
    }

    /** 
     * 該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行。該方法將在整個請求完成之後,也就是DispatcherServlet渲染了檢視執行, 
     * 這個方法的主要作用是用於清理資源的,當然這個方法也只能在當前這個Interceptor的preHandle方法的返回值為true時才會執行。 
     */  
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
		System.out.println(">>>MyInterceptor1>>>>>>>在整個請求結束之後被呼叫,也就是在DispatcherServlet 渲染了對應的檢視之後執行(主要是用於進行資源清理工作)");
	}
}
攔截器實現類中幾個函式的作用,以及呼叫的先後順序都很明確,我這裡就不多介紹了。

第二部:建立一個Java類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。例項化我們自定義的攔截器,然後將對像手動新增到攔截器鏈中(在addInterceptors方法中新增)。 

package example.configuration;
import example.Interceptor.ErrorInterceptor;
import example.Interceptor.MyInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多個攔截器組成一個攔截器鏈
        // addPathPatterns 用於新增攔截規則
        // excludePathPatterns 使用者排除攔截
        registry.addInterceptor(new ErrorInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

}

到這裡攔截器就基本實現了,我上面給出的例子中是可以實現對404或者500的攔截。

不過需要注意的是,這種攔截有時候也會出現特別大問題。例如一個網頁中如果需要載入很多的圖片或者js檔案資源,可是正好沒有這個資源,也就是找不到這麼多個資源報一堆的404錯誤。這個時候如果還是單純的使用這種攔截就會出現null指標異常的情況。

針對這種情況,我研究了一種方法可以解決這樣類似的問題。

解決方案就是:建立一個類並實現ErrorController介面,這樣就可以利用這個類來處理上面發生的問題了。

下面給出程式碼:

package example.controller;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainsiteErrorController implements ErrorController {
    private static final String ERROR_PATH = "/error";
    @RequestMapping(value=ERROR_PATH)
    public String handleError(){
        return "errorpage/error";
    }
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }
}
這樣就可以實現對404,500等錯誤資訊的攔截了,而且也不會發生那種空指標異常的情況了,是不是特別方便啊!如果大家對文章有什麼問題或者疑意之類的,可以加我訂閱號在上面留言,訂閱號上面我會定期更新最新部落格。如果嫌麻煩可以直接加我wechat:lzqcode

相關推薦

SpringBoot實現攔截 實現404500錯誤攔截

今天給大家介紹一下SpringBoot中攔截器的用法,相比Struts2中的攔截器,SpringBoot的攔截器就顯得更加方便簡單了。只需要寫幾個實現類就可以輕輕鬆鬆實現攔截器的功能了,而且不需要配置任何多餘的資訊,對程式設計師來說簡直是一種福利啊。廢話不多說,下面開始介紹攔

用ESP8266 WIFI模塊連接服務實現與服務相互通訊

很多 底層 同學 繼續 image 要求 png 工具 網絡調試   最近在做一個智能鎖的項目,該項目要求實現在任何地方(當然是要有網絡的)可以在手機上用APP開鎖。而我負責的部分主要是實現底層與服務器連接,並且要能相互通訊。考慮了很多問題,最終選擇了用ESP826

如何安裝FTP服務實現文件共享

free protocol 字符 高速 作用 info roo 詳細信息 strong FTP服務器(File Transfer Protocol Server)是在互聯網上提供文件存儲和訪問服務的計算機,它們依照FTP協議提供服務。 FTP(File Transfer P

java 使用logback日誌實現日誌按天分類壓縮儲存

以maven專案作為構建工具為例,首先引入使用logback需要的3個依賴,需要注意使用logback是需要引入slf4j-api的,因為logback是基於slf4j的 <!--logback--> <dependency> <groupId>ch.qo

SpringBoot自定義註解攔截根據環境變數選擇初始化

TimeStamp.java 自定義註解 import java.lang.annotation.*; /** * @author Meng.Liu * @create 2017-10-30

在viewpager動態新增view實現偽無限迴圈

        viewpager的使用,大家都熟悉,它可以實現頁面之間左右滑動的切換,這裡有一個需求,就是viewpager裡面載入的頁數不是確定的,而是根據資料的多少來確定的。常見的應用就是在一個新聞的詳細頁面中,顯示與此新聞有關的圖片。         下面我們來看一

用vlan劃分實現全網互通隔離c1,c3c2,c4

vlan 劃分 trunk1配pc地址c1ip 192.168.10.10 192.168.10.1c2 ip 192.168.20.10 192.168.20.1c3ip 192.168.10.10 192.168.10.1c4ip 192.168.20.20 192.168.20.12二層交換sw1配置n

PHP實現註冊登入實現註冊時動態檢查使用者名稱是否可用

用PHP實現註冊登入,原理就是註冊時往資料庫中插入使用者資訊比如使用者名稱和密碼等,登陸即驗證輸入的賬號密碼在資料庫中是否存在。 1、註冊介面html程式碼: <html> <head> <meta http-equiv="Content-

SpringBoot連線MYSQL資料庫使用JPA進行資料庫的相關操作

package example.controller; import example.dao.UserDao; import example.entity.User; import org.springframework.beans.factory.annotation.Autowired; import o

Android自定義View實現圖片顯示實現縮放、拖拽、切換功能

這裡貼三個檔案的原始碼,第一個是main.java package com.example.test; import java.util.ArrayList; import java.util.List; import com.example.test.MyXZ; i

C++查詢字串同樣的字元將其刪除不改變字串的順序

輸入一個字串,找到相同的字元,將後面出現的字元刪除,不改變字串的順序。 例如: Hello    -》Helo 人山人海   -》人山海 程式碼實現: #include <iostream> #include<string>

從UIWebView呼叫iOS相簿選擇圖片上傳到Linux Web伺服器

======首先看以下ios端======= ViewController.h // //  ViewController.h //  Xcode_FileUpload // //  Created by KirSsu Ryu on 12-8-7. //  Copyright (c) 201

很多人在Google Play商店購買或下載APP時出現問題例如在你新安裝的系統恢復APP或想要安裝心願單的APP時Play商店出現不能載入錯誤這實在是太煩人了 所以我通過搜尋把可

error 491 問題說明: downloads and updates impossible. (不能下載或更新) 解決方案: 進入您的裝置設定,刪除Google賬戶的所有內容。重啟您的Android裝置並重新新增G

給定一個字串你需要顛倒每個單詞的字元順序同時仍然保留空白初始的字順序

本題源自leetcode  557 -------------------------------------------------- 思路  將每個單詞反轉,遇見空格就跳過。 程式碼: string reverseWords(string s) { i

JSP捕獲404500錯誤頁面自定義

當網站頁面找不到或者伺服器內部出現錯誤的時候,我們不想讓使用者看到預設的那張 404,500 的錯誤頁面,在web.xml檔案中加入下面程式碼就可以自定義錯誤頁面了 <error-page> <error-code>404</e

SpringBoot整合Mybatis自定義攔截實現拼接sql修改

一、應用場景 1.分頁,如com.github.pagehelper的分頁外掛實現; 2.攔截sql做日誌監控; 3.統一對某些sql進行統一條件拼接,類似於分頁。 二、MyBatis的攔截器簡介 然後我們要知道攔截器攔截什麼樣的物件,攔截物件的什麼行為,什麼時候攔截? &n

SSH開發 | 配合自定義註解 Stratus攔截實現 方法級粒度 用戶鑒權

struts OS action gin 所有 具體實現 getmethod red nal 1.提要   本文是 小小商城-SSH版的 細節詳解系列 之一,項目 github:https://github.com/xenv/S-mall-ssh 本文代碼大部分在 gith

Ubuntu12.04的虛擬機安裝Ubuntu16.04實現遠程控制16.04

des window set 客戶端 選擇 默認 第一個 虛擬 聲音 目錄 1、設置網絡連接 1.1 VMware虛擬機網絡地址設置 1.2 設置虛擬機內Ubuntu16.04的網絡模式 未開機狀態下 開機狀態下 1.3 查看虛擬機中Ubuntu16.04的IP 2、

Spring MVC實現靜態資源訪問viewcontroller攔截路徑匹配配置

spring mvc 定製配置需要配置類繼承 一個webmvcconfigureradapter ,通過重寫這個類的方法,來完成常用的配置 包括靜態資源 , controller ,攔截器,路徑匹配的配置等等 具體程式碼如下 @Component public class WebMv

MyBatis分頁功能的實現(陣列分頁、sql分頁、攔截RowBounds分頁)

前言:學習hibernate & mybatis等持久層框架的時候,不外乎對資料庫的增刪改查操作。而使用最多的當是資料庫的查詢操