第十七章著重講解了異常處理的方法。傳統單體架構下,全局異常處理類通過實現HandlerExceptionResolver介面實現異常的統一處理,可以根據不同異常返回不同的錯誤頁面。但在前後端分離的開發中,使用@ControllerAdvice和@ExceptionHandler註解更為方便。@Con... ...
第十七章、異常處理
異常處理作用:用來解決整合系統中任意一個控制器拋出異常時的統一處理入口
傳統方式
傳統單體架構下的處理方式
-
配置全局異常處理類
@Component public class GlobalExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("進入全局異常處理"); System.out.println("當前異常為 = " + ex); ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("500"); //跳轉錯誤頁面 return modelAndView; } }
resolveException
:當控制器方法出現異常時,如果該方法沒有try...catch,則會進入當前方法 -
針對不同異常返回不同的錯誤顯示頁面
@Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("進入全局異常處理"); System.out.println("當前異常為 = " + ex); ModelAndView modelAndView = new ModelAndView(); // 針對不同異常類型跳轉不同頁面 **if (ex instanceof UserNameNotFoundException) { modelAndView.setViewName("error"); return modelAndView; }** modelAndView.setViewName("500"); //跳轉錯誤頁面 return modelAndView; }
前後端分離開發異常處理
-
**@ControllerAdvice
**@ControllerAdvice
是Spring框架中用於全局處理異常的註解,修飾類,可以定義全局性的處理器方法,用於處理應用程式中所有Controller層拋出的異常。**@ControllerAdvice(value="com.baizhi.controller")**
可以通過value屬性設置生效的包 -
**@ExceptionHandler**
@ExceptionHandler
註解用於處理異常的註解。修飾方法,用於捕獲特定類型的異常併進行處理。**@ExceptionHandler(value = {Exception.class,``UserNameNotFoundException.class})
** 通過value屬性定義多個異常進行處理
@ControllerAdvice(value = "com.baizhi.controller")
public class GlobalExceptionResolver {
// 指定自定義異常或其他異常需要返回不同的結果
@ExceptionHandler(value = UserNameNotFoundException.class)
@ResponseBody
public ResponseEntity<String> exceptionHandlers(Exception e) {
System.out.println("進入非法參數異常處理");
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
// 處理所以異常
@ExceptionHandler(value = Exception.class) //修飾方法,作用:處理指定異常,value屬性:指定處理異常類型
@ResponseBody
public ResponseEntity<String> exceptionHandler(Exception e) {
System.out.println("進入自定義異常處理");
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
第十八章、CORS
CORS(跨源資源共用)是一種用於解決跨域請求問題的機制。
在Web開發中,由於瀏覽器的同源策略,不同源(功能變數名稱、協議、埠號任何一個不同)之間的前端JavaScript代碼無法直接進行跨域請求。
CORS的核心思想是在伺服器端響應中添加一些特定的HTTP頭部,以允許來自其他源的請求訪問伺服器資源。這些頭部包括Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Allow-Headers
等。
-
同源策略
是瀏覽器的一個安全功能,不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方資源。同源策略是瀏覽器安全的基石
-
什麼是源 origin
源就是協議、功能變數名稱和埠號。例如:http://www.baidu.com:80這個url
協議:http
功能變數名稱:www.baidu.com
埠:80
-
哪些操作不會受到同源限制
-
哪些操作會受到同源限制
ajax
出現跨域請求
-
示例
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <script> function test(){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function (){ if (xhr.status == 200 && xhr.readyState == 4) { console.log(xhr.responseText); document.getElementById("msg").innerText="返回結果為:"+xhr.responseText; } } xhr.open("GET", "http://localhost:8989/demo"); xhr.send(); } </script> </head> <body> <h1>測試跨域</h1> <input type="button" value="發送跨域請求" onclick="test()"> <h4 id="msg"></h4> </body> </html>
我們使用idea內置伺服器打開此靜態網頁測試,會出現跨域錯誤,因為不同源
SpringBoot解決跨域問題
-
局部解決跨域
**@CrossOrigin**
:修飾類和方法,代表被修飾的所有方法都能允許進行跨域請求@RestController @RequestMapping("demo") **@CrossOrigin** public class DemoController { @GetMapping public ResponseEntity<String> demo() { System.out.println("demo ok"); return new ResponseEntity<>("響應demo ok", HttpStatus.OK); }
-
全局解決跨域
自定義跨域配置類
**import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter;** @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 允許任何功能變數名稱使用 corsConfiguration.addAllowedHeader("*"); // 允許任何頭 corsConfiguration.addAllowedMethod("*"); // 允許任何方法 source.registerCorsConfiguration("/**", corsConfiguration);// 配置所有請求 return new CorsFilter(source); } }
註意,只能使用一種跨域解決方法,兩種都用會出現問題
作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。