在前邊部分咱們已經學會了基本的web開發流程,在web開發中,咱們一般會對請求作統一處理,好比未登陸的用戶要攔截掉相關請求,報錯頁面統一顯示等等,這些都須要配置,能夠大大簡化咱們的代碼,實現功能的完整性與統一性。html
首先咱們先作一個登陸身份驗證攔截器,來攔截那些沒有登陸的用戶,保護咱們的資源。下面咱們建立一個攔截器,須要實現攔截器接口。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
springboot默認已經配置了統一錯誤處理,只不過錯誤頁面是內置的,可能不是咱們想要的,因此若是咱們要自定義錯誤頁面,還得從新配置。瀏覽器
在使用模板的狀況下,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頁面:
默認狀況下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返回:
不得不說,springboot真是很懂咱們,把全部東西都配置好了,只要咱們稍微修修補補就能很好的知足咱們的需求了,這裏咱們能夠徹底不要原始的錯誤信息,能夠把錯誤信息獲取數據組裝成咱們標準統一格式的錯誤信息,也能夠在這裏統一記錄咱們的錯誤日誌,也是很是的方便。