SpringBoot起飛系列-攔截器和統一錯誤處理(七)

1、前言

在前邊部分咱們已經學會了基本的web開發流程,在web開發中,咱們一般會對請求作統一處理,好比未登陸的用戶要攔截掉相關請求,報錯頁面統一顯示等等,這些都須要配置,能夠大大簡化咱們的代碼,實現功能的完整性與統一性。html

2、攔截器配置

首先咱們先作一個登陸身份驗證攔截器,來攔截那些沒有登陸的用戶,保護咱們的資源。下面咱們建立一個攔截器,須要實現攔截器接口。java

 1 package com.example.demo.component;  2 
 3 import org.springframework.web.servlet.HandlerInterceptor;  4 import org.springframework.web.servlet.ModelAndView;  5 
 6 import javax.servlet.http.HttpServletRequest;  7 import javax.servlet.http.HttpServletResponse;  8 
 9 public class LoginHandlerInterceptor implements HandlerInterceptor { 10 
11  @Override 12     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 13         if(request.getSession().getAttribute("loginUser") == null){ 14             request.setAttribute("msg","請先登陸"); 15             request.getRequestDispatcher("/index.html").forward(request,response); 16             return false; 17  } 18         return true; 19  } 20 
21  @Override 22     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 23 
24  } 25 
26  @Override 27     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 28 
29  } 30 }

這個攔截器的做用是獲取當前session中的loginUser屬性,若是有值說明登陸了就能夠放行,固然咱們須要在登陸成功的代碼裏邊設置好session的這個屬性。web

在WebConfig中添加咱們的攔截器:spring

 1     //全部的WebMvcConfigurerAdapter組件都會一塊兒起做用
 2     @Bean //將組件註冊在容器
 3     public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){  4         WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {  5  @Override  6             public void addViewControllers(ViewControllerRegistry registry) {  7                 registry.addViewController("/").setViewName("login");  8                 registry.addViewController("/index.html").setViewName("login");  9  } 10 
11  @Override 12             public void addInterceptors(InterceptorRegistry registry) { 13                 registry.addInterceptor(new LoginHandlerInterceptor()) 14                         .excludePathPatterns("/index.html","/","/user/login"); 15  } 16  }; 17         return adapter; 18     }

第12-15行,註冊咱們攔截器以後,排除掉不須要驗證的頁面,默認狀況下靜態資源不會作驗證。json

3、統一錯誤處理

springboot默認已經配置了統一錯誤處理,只不過錯誤頁面是內置的,可能不是咱們想要的,因此若是咱們要自定義錯誤頁面,還得從新配置。瀏覽器

3.1 定製錯誤頁面

在使用模板的狀況下,springboot默認會找到/templates/error/xxx.html頁面做爲錯誤頁面顯示,好比咱們用4xx.html處理全部httpstatuscode以4開頭的錯誤,好比401,403,404,若是有具體的數字,就先用具體的數字對應頁面,若是沒有就用有前綴開頭的頁面。springboot

顯示錯誤頁面時,頁面上能獲取到如下信息,可讓咱們看到詳細的錯誤信息:session

timestamp:時間戳。app

status:狀態碼。ide

error:錯誤提示。

exception:異常對象。

message:異常消息。

errors:JSR303數據校驗的錯誤都在這裏。

在沒有模板的狀況下,會去找靜態資源下的相關頁面,若是靜態資源下也沒有,就用springboot默認的錯誤頁面。以下,我添加了一個4xx.html的錯誤處理頁面,當我訪問一個不存在的路徑(404錯誤)時,就會顯示我添加的4xx.html頁面:

3.2 自定義返回的json數據

默認狀況下springboot會出現自適應的錯誤顯示,當用瀏覽器訪問(接受類型爲text/html)時會顯示錯誤頁面,當用postman(接受類型爲application/json)會顯示錯誤json數據。不過顯示的字段都是內置固定的,若是咱們想要添加本身的錯誤數據,就要本身定製了。

在springboot中,出現錯誤之後,會來到/error請求,會被BasicErrorController處理,響應出去能夠獲取的數據是由getErrorAttributes獲得的(是AbstractErrorController(ErrorController)規定的方法),這裏咱們就能夠編寫一個ErrorController的實現類【或者是編寫AbstractErrorController的子類】,放在容器中替換掉原來的ErrorController,頁面上能用的數據,或者是json返回能用的數據都是經過errorAttributes.getErrorAttributes獲得。

添加自定一個ErrorAttribute,重寫errorAttributes.getErrorAttributes,返回本身的數據map:

 1 package com.example.demo.component;  2 
 3 import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;  4 import org.springframework.stereotype.Component;  5 import org.springframework.web.context.request.WebRequest;  6 
 7 import java.util.Map;  8 
 9 @Component 10 public class MyErrorAttributes extends DefaultErrorAttributes { 11  @Override 12     public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { 13         Map<String, Object> map =  super.getErrorAttributes(webRequest, includeStackTrace); 14         map.put("code",1); 15         map.put("msg","自定義錯誤"); 16         return map; 17  } 18 }

訪問錯誤頁面和json返回:

4、總結

不得不說,springboot真是很懂咱們,把全部東西都配置好了,只要咱們稍微修修補補就能很好的知足咱們的需求了,這裏咱們能夠徹底不要原始的錯誤信息,能夠把錯誤信息獲取數據組裝成咱們標準統一格式的錯誤信息,也能夠在這裏統一記錄咱們的錯誤日誌,也是很是的方便。

相關文章
相關標籤/搜索