什么是 Spring Boot?
Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各種啟動器,開發者能快速上手。
為什么要用 Spring Boot?
Spring Boot 優點非常多,如:
- 獨立運行
- 簡化配置
- 自動配置
- 無代碼生成和XML配置
- 應用監控
- 上手容易
SpringBoot有哪些優點?
1、獨立運行。
內嵌了servlet,tomat等,不需要打成war包部署到容器中,只需要將SpringBoot項目打成jar包就能獨立運行。
2、簡化配置
啟動器自動依賴其他組件,簡少了 maven 的配置。各種常用組件及配置已經默認配置完成,無需過多干預。
3、避免大量的Maven導入和各種版本沖突
4、應用監控
Spring Boot 提供一系列端點可以監控服務及應用。
Spring Boot 的核心配置文件有哪幾個?它們的區別是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件這個容易理解,主要用於 Spring Boot 項目的自動化配置。
bootstrap 配置文件有以下幾個應用場景。
- 使用 Spring Cloud Config 配置中心時,這時需要在 bootstrap 配置文件中添加連接到配置中心的配置屬性來加載外部配置中心的配置信息;
- 一些固定的不能被覆蓋的屬性;
- 一些加密/解密的場景;
Spring Boot 的配置文件有哪幾種格式?它們有什么區別?
.properties 和 .yml,它們的區別主要是書寫格式不同。
1).properties
app.user.name = javastack
2).yml
app:
user: name: javastack
另外,.yml 格式不支持 @PropertySource 注解導入配置。
Spring Boot 的核心注解是哪個?它主要由哪幾個注解組成的?
啟動類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個注解:
@SpringBootConfiguration:組合了 @Configuration 注解,實現配置文件的功能。代表當前是一個配置類
@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
SpringBoot自動配置原理是什么?
1、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能@EnableAutoConfiguration。
2、查看@EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector給容器中導入一些組件。
3、查看AutoConfigurationImportSelector,其中public String[] selectImports(AnnotationMetadata annotationMetadata)方法內 最終調用getCandidateConfigurations()方法
4、查看 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes),獲取候選的配置,這個是掃描所有jar包類路徑下"META-INF/spring.factories"
5、然后把掃描到的這些文件包裝成Properties對象。
6、從properties中獲取到EnableAutoConfiguration.class類名對應的值,然后把他們添加在容器中。
簡而言之,整個過程就是將類路徑下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。
SpringBoot 需要獨立的容器運行嗎?
不需要,SpringBoot內置tomcat/jetty等容器
開啟SpringBoot 特性有哪幾種方式?
1 繼承spring-boot-starter-parent項目
2 導入spring-boot-dependencies項目依賴
SpringBoot、Spring MVC和Spring有什么區別?
Spring:主要用來創建IOC容器,依賴注入,實現程序間的松耦合
SpringMVC: 主要是用來做WEB開發,通過各種組件的協調配合,簡化Web應用的開發
SpringBoot: SpringBoot更像是一個管家,當使用到對應功能時,只需要導入指定應用啟動器,SpringBoot就能夠在底層默認其配置,大大簡化了開發所需的繁雜配置
SpringBoot啟動時都做了什么?
Springboot的啟動,主要創建了配置環境 (environment)、事件監聽 (listeners)、應用上下文 (applicationContext),並基於以上條件,在容器中開始實例化我們需要的Bean,至此,通過SpringBoot啟動的程序
已經構造完成。
你如何理解 Spring Boot 中的 Starters?
Starters可以理解為啟動器,它包含了一系列可以集成到應用里面的依賴包,你可以一站式集成 Spring 及其他技術,而不需要到處找示例代碼和依賴包。如你想使用 Spring JPA 訪問數據庫,只要加入 spring-boot-starter-data-jpa 啟動器依賴就能使用了。
Starters包含了許多項目中需要用到的依賴,它們能快速持續的運行,都是一系列得到支持的管理傳遞性依賴。
Spring Boot 支持哪些日志框架?推薦和默認的日志框架是哪個?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作為日志框架,如果你使用 Starters 啟動器,Spring Boot 將使用 Logback 作為默認日志框架
SpringBoot中如何解決跨域問題 ?
1、基於WebMvcConfigurerAdapter配置加入Cors的跨域
跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發送 GET 請求,無法發送其他類型的請求,在 RESTful 風格的應用中,就顯得非常雞肋,因此我們推薦在后端通過(CORS,Cross-origin resource sharing)
來解決跨域問題。這種解決方案並非 Spring Boot 特有的,在傳統的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現在可以通過實現WebMvcConfigurer接口然后重寫
addCorsMappings方法解決跨域問題
2、創建一個filter解決跨域
項目中前后端分離部署,所以需要解決跨域的問題。 我們使用cookie存放用戶登錄的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。 當用戶登錄以后,正常使用;
當用戶退出登錄狀態時或者token過期時,由於攔截器和跨域的順序有問題,出現了跨域的現象。 我們知道一個http請求,先走filter,到達servlet后才進行攔截器的處理,如果我們把cors放在filter里,就可以優先於權限攔截器執行。
3、controller配置CORS
controller方法的CORS配置,您可以向@RequestMapping注解處理程序方法添加一個@CrossOrigin注解,以便啟用CORS(默認情況下,@CrossOrigin允許在@RequestMapping注解中指定的所有源和HTTP方法)
@CrossOrigin 表示所有的URL均可訪問此資源
@CrossOrigin(origins = “http://127.0.0.1:8080”) 表示只允許這一個url可以跨域訪問這個controller
@CrossOrigin這個注解用起來很方便,這個可以用在方法上,也可以用在類上。如果你不設置他的value屬性,或者是origins屬性,就默認是可以允許所有的URL/域訪問。
-value屬性可以設置多個URL。 -origins屬性也可以設置多個URL。 -maxAge屬性指定了准備響應前的緩存持續的最大時間。就是探測請求的有效期。 -allowCredentials屬性表示用戶是否可以發送、處理 cookie。默認為false -allowedHeaders 屬性表示允許的請求頭部有哪些。 -methods 屬性表示允許請求的方法,默認get,post,head。
什么是 CSRF 攻擊?
CSRF 代表跨站請求偽造。這是一種攻擊,迫使最終用戶在當前通過身份驗證的Web 應用程序上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,因為攻擊者無法查看對偽造請求的響應。
簡單來說就是:攻擊者盜取合法用戶登錄信息,通過盜取賬戶進行登錄,然后以合法用戶的身份發送惡意請求,但是請求對於服務器來說是合法的。
