問題:
1、 SpringBoot異常的設(shè)計的原理
2、 前后端分離開發(fā),日志應(yīng)該如何進(jìn)行記錄,在出現(xiàn)問題的時候,方便定位問題?
3、 跨域的含義
回答:
3、
跨域的含義:跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,這里跨域是廣義的。其實我們通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。瀏覽器從一個域名的網(wǎng)頁去請求另一個域名的資源時,域名、端口、協(xié)議任一不同,都是跨域。
跨域的訪問會帶來許多安全性的問題,比如,cookie 一般用于狀態(tài)控制,常用于存儲登錄的信息,如果允許跨域訪問,那么別的網(wǎng)站只需要一段腳本就可以獲取你的 cookie,從而冒充你的身份去登錄網(wǎng)站,造成非常大的安全問題,因此,現(xiàn)代瀏覽器均推行同源策略。
跨域解決方案:
通過 jsonp 跨域
document.domain + iframe 跨域
location.hash + iframe
window.name + iframe 跨域
postMessage 跨域
跨域資源共享(CORS)
nginx 代理跨域
nodejs 中間件代理跨域
WebSocket 協(xié)議跨域
什么是同源策略?
同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995 年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到 XSS、CSFR 等攻擊。所謂同源是指”協(xié)議+域名+端口”三者相同,即便兩個不同的域名指向同一個 ip 地址,也非同源。
原文地址:https://www.leiue.com/what-is-cross-domain
2、
前端如何定位線上BUG:使用前端監(jiān)控系統(tǒng)來記錄日志。
一.統(tǒng)計前端錯誤:我們可以通過重寫window.onerror 方法來進(jìn)行jsError的監(jiān)聽。它能夠為我們記錄下線上的很多錯誤,以及一些額外的信息。
二.分析錯誤詳情:線上的錯誤日志統(tǒng)計出來了,我們可以解析這些錯誤日志來知道用戶的機型,版本,系統(tǒng)平臺,影響范圍,以及具體的錯誤位置,從而提高我們解決問題的效率。
三.如果我們無法復(fù)現(xiàn)用戶錯誤的時候,那么我們就很難解決問題。我們需要用戶的行為記錄。記錄下用戶的跳轉(zhuǎn)日志,就能夠復(fù)現(xiàn)出用戶的行為,從而復(fù)現(xiàn)BUG。記錄下用戶的請求時間,參數(shù),響應(yīng)時間,響應(yīng)狀態(tài)等等,可以具體分析出來接口對頁面的影響。記錄用戶的點擊行為。
后端如何定位線上BUG:
一.記錄日志:以Spring Boot項目為例。默認(rèn)使用LogBack日志系統(tǒng),默認(rèn)將日志打印到控制臺上,默認(rèn)的日志級別為INFO。將日志信息保存到日志文件中在application.properties配置文件中加上logging.file和logging.path即可。配置日志級別在application.properties配置文件中添加logging.level即可,日志級別總共有TRACE < DEBUG < INFO < WARN < ERROR < FATAL ,且級別是逐漸提供,如果日志級別設(shè)置為INFO,則意味TRACE和DEBUG級別的日志都看不到。
原文地址:https://www.cnblogs.com/warm-stranger/p/10430346.html
http://www.webfunny.cn/demo/overview.html
https://www.cnblogs.com/bigdataZJ/p/springboot-log.html
1、
一:BasicErrorController,這個類是默認(rèn)處理/error請求的。

其中有這樣一段代碼來處理錯誤請求:
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
? ? @RequestMapping(produces = "text/html")//產(chǎn)生html類型的數(shù)據(jù);瀏覽器發(fā)送的請求來到這個方法處理
? ? public ModelAndView errorHtml(HttpServletRequest request,
? ? ? ? HttpServletResponse response) {
? ? ? ? HttpStatus status = getStatus(request);
? ? ? ? Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
? ? ? ? request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
? ? ? ? response.setStatus(status.value());
? ? ? ? //去哪個頁面作為錯誤頁面;包含頁面地址和頁面內(nèi)容
? ? ? ? ModelAndView modelAndView = resolveErrorView(request, response, status, model);
? ? }
@RequestMapping
@ResponseBody //產(chǎn)生json數(shù)據(jù),其他客戶端來到這個方法處理;
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
? ? Map<String, Object> body = getErrorAttributes(request,
? ? isIncludeStackTrace(request, MediaType.ALL));
? ? HttpStatus status = getStatus(request);
? ? return new ResponseEntity<Map<String, Object>>(body, status);
}
二:DefaultErrorViewResolver

處理步驟:
一但系統(tǒng)出現(xiàn)4xx或者5xx之類的錯誤;ErrorPageCustomizer就會生效(定制錯誤的響應(yīng)規(guī)則);就會來到/error請求;就會被BasicErrorController處理。
原文地址:https://blog.csdn.net/sihai12345/article/details/81220781