面試題
1、JWT
①、JWT(全稱:Json Web Token)
是一個開放標準(RFC 7519)
,它定義了一種緊湊的、自包含的方式,用于作為 JSON 對象在各方之間安全地傳輸信息。
②、JWT 的原理是,服務器認證以后,生成一個 JSON 對象,發回給用戶
③、JWT是由頭部、負載和簽名這三部分組成的,其中頭部和負載都是明文,簽名是經過加密處理的。頭部是加密方式(HS256)
2、Session和Cookie區別
Session和Cookie都是客戶端-服務端的一種存儲機制,但是它們之間有一些重要的區別:
1、存儲位置:Cookie數據存放在客戶端,Session數據存儲在服務端
2、數據共享:Cookie是不安全的,可以通過網絡被共享,而Session更加安全,因為數據只在客戶端和服務器之間共享。
3、數據大小限制:單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie,而session則存儲與服務端,瀏覽器對其沒有限制。
4、數據有效期:Cookie過期時間由開發者設置,而Session數據在用戶關閉瀏覽器后自動過期
5、數據傳輸:Cookie在每次請求時都需要手動添加到HTTP頭中,而Session ID會自動添加到HTTP頭中,因此Session更加高效
總之,Cookie更加靈活,但不夠安全,適用于不需要太高安全性的場景;Session更加安全,適用于對安全性要求較高的場景。
3、route與router區別
1、router 主要負責頁面跳轉
2、route 獲取當前頁面的參數等信息
4、為什么要用token,token的優勢
Token是一種用于驗證用戶身份及權限的機制,它是由服務器頒發給客戶端的,用于驗證客戶端的身份及權限。Token的優勢有:
1、增強安全性:Token機制使用了時間戳和簽名算法,使得Token更加安全,可以有效防止CSRF攻擊
2、簡化客戶端代碼:Token機制允許客戶端存儲服務器頒發的Token,從而減少了客戶端與服務器之間的交互,簡化了客戶端代碼
3、靈活性:Token機制可以根據具體需求進行靈活配置,可以用于不同類型的請求和場景
4、易于實現:Token機制的實現相對簡單,可以使用現有的框架和庫來實現。
5、token攔截器,前后端如何驗證
Token攔截器是一種用于驗證用戶身份和權限的機制,它通過在HTTP請求頭中添加一個Token字段,服務器在處理請求時會檢查Token的有效性。
具體實現流程如下:
1、當用戶成功登錄時,在服務器端生成一個Token,并將其返回給客戶端
2、客戶端在每次發送請求時,將Token添加到HTTP請求頭中。
3、服務攔截器收到請求后,從HTTP請求頭中獲取Token。
4、服務器對Token進行驗證,包括檢查Token是否過期、是否被篡改等。
5、如果Token驗證通過,則服務器繼續處理請求;如果Token驗證失敗,則返回錯誤響應。
通過Token攔截器,可以實現前后端的聯合驗證,增強系統的安全性。前后端分別負責生成、驗證和存儲Token,以確保Token的安全性和有效性。
6、如何使用自定義注解和AOP實現萬能分頁
一、先自定義一個注解,然后這個注解上面有三個注解分別為:@Target、@Retention、@Documented
1、@Target({ElementType.METHOD})
在方法上面放注解
2、@Retention(RetentionPolicy.RUNTIME)
表示該注解在程序運行時仍然被保留并可以被讀取。
3、@Documented
用于指示注解應該被包含在代碼文檔中
二、定義切面類 在類里定義切入點
二、AOP,在需要分頁的方法上面打上自定義注解,然后使用切入點注解,在有自定義注解的方法運行之前,也就是在環繞通知里面(@around)完成分頁配置。
7、reduce函數的概念和使用場景
1、reduce概念:reduce函數是用于對數據進行累加或聚合操作的函數。它接收一個函數作為參數,用于指定聚合的方式,然后將輸入的迭代器作為參數傳入,通過不斷調用指定的聚合函數來將輸入的元素進行累加或聚合操作,最后返回一個單獨的值
2、使用場景:把扁平化數據轉化為樹形數據,(統計總數、計算總和、求最大值或最小值)
8、利用線程傳遞數據
1、ThreadLocal是一個類,它提供了一種將對象保存為線程變量的方法,相當于一個特殊的Map,它通過提供get()和set()方法來實現線程局部變量的功能。
2、ThreadLocalMap的作用:①、為每一個線程創建一個變量,這個變量可以隨時獲取,并且可以隨時設置。
②、可以跨類跨方法傳遞變量
3、ThreadLocalMap的優點:①、安全性、可以方便的在多線程中傳遞數據。
②、可以在service層、controller層里面少些代碼,減少代碼量。
9、MyBatis攔截器
-
Executor 攔截器:對于 Executor 類中的四個基本操作(update、query、flushStatements、commit/rollback),執行前后都可以進行攔截。
-
ParameterHandler 攔截器:對查詢參數進行處理的攔截器,可以在執行 SQL 語句前對參數進行處理,比如對參數進行加密等。
-
ResultHandler 攔截器:對查詢結果集進行處理的攔截器,可以在獲取結果集時對結果進行處理,比如將結果集轉換為 Excel 文件等。
-
StatementHandler 攔截器:對 SQL 語句進行處理的攔截器,可以在執行 SQL 語句前對 SQL 進行處理,比如對 SQL 進行分頁等。
10、內存泄漏和內存溢出
1、內存泄漏:指程序運行后,沒有釋放所占用的內存空間(程序中有引用沒有釋放,不能被GC回收),一次內存泄漏可能不會有很大的影響,但長時間的內存泄漏,堆積到一定程度就會產生內存溢出。
2、內存溢出:內存溢出(Memory Overflow)是指程序請求的內存超出了 JVM 可以提供的最大內存限制,從而導致內存無法分配而產生的錯誤。內存溢出通常由于應用使用的內存不斷增長,超過了 JVM 配置的堆內存大小而導致。內存溢出會導致應用崩潰或者變得非常緩慢。
11、什么 SPI 和 Spring SPI
1、SPI(Service Provider Interface)是一種設計模式,翻譯過來就是“服務提供接口”,再說簡單一點就是提供某一個服務的接口, 提供給服務開發者或者服務生產商來進行實現。
2、Java SPI 是JDK內置的一種動態加載擴展點的實現。
3、這個機制在一般的業務代碼中很少用到,但是在底層框架中卻被大量使用,包括JDBC、Dubbo
、Spring框架、日志接口中都有用到,不同的是有的使用Java原生的實現,有的框架則自己實現了一套SPI機制.
4、Spring中的SPI相比于JDK原生的,它的功能更為強大,因為它可以替換的類型不僅僅局限于接口/抽象類,它可以是任何一個類,接口,注解;
5、正因為Spring SPI是支持替換注解類型的SPI,這個特性在Spring Boot中的自動裝配有體現(EnableAutoConfiguration注解)
6、Spring的SPI文件是有規矩的,它需要放在工程的META-INF下,且文件名必須為spring.factories ,而文件的內容本質就是一個properties
12、SpringBoot如何自動裝配
1、SpringBoot啟動的時候加載主配置類,@EnableAutoConfiguration注解開啟了自動配置功能。
2、@EnableAutoConfiguration注解里面有一個注解叫@Import,它使用反射的方式導入了AutoConfigurationImportSelector類
3、在AutoConfigurationImportSelector類中有一個getCandidateConfigurations(獲取候選配置)方法,它里面調用了SpringFactoriesLoader類
4、在SpringFactoriesLoader里面配置了工廠資源位置,這個位置是固定的(META-INF/spring.factories)
spring.factories是KV結構
5、然后通過spring.factories里面的KV值來自動裝配
13、如何實現Starter
1、要有被封裝的類(MyResponseAdvice)
原因:因為我們這整個starter都是為它服務的。
2、寫一個properties包,里面放各種屬性配置類,在這些類上面有兩個注解,分別是@ConfigurationProperties(配置注解)和@Data,其中@ConfigurationProperties是別人配置starter的前綴
3、寫一個autoConfigution包,里面放的是自動配置類,這個類上面也有兩個注解,分別為@ConditionalOnProperty(根據屬性開啟自動配置的開關)和@Import(導入的類),其中@ConditionalOnProperty這個注解根據屬性開啟自動配置的開關,而@Import是需要被封裝的類
4、最后在resources包下創建 META-INF包 和 spring.factories文件,配置自動注入的key和value
14、ThreadLocal的優點
-
線程隔離:每個線程都有自己的獨立變量副本,不受其他線程的影響,確保了線程安全性。
-
簡單易用:使用ThreadLocal可以方便地將數據與線程關聯起來,無需手動管理線程間的數據傳遞。
-
開箱即用,開銷小:在多線程環境下,可以避免因訪問共享變量而需要進行的上鎖操作,降低了使用復雜性。
-
適用于各種場景:如對象跨層傳遞、事務操作、數據庫連接等,能夠打破層次間的約束,提高代碼的可維護性和擴展性。