SpringBoot——springboot SPI原理与实战
Spring Boot 支持輕松綁定的理解是什么?
輕松綁定, 是一種屬性名稱不需要與環(huán)境屬性的鍵匹配的方式。 在 Spring Boot, 輕松綁定適用于配置屬性的類(lèi)型安全綁定。 例如, 如果使用了帶有 @ConfigurationPropertie 注釋的 Bean 類(lèi)中的屬性 sampleProp, 那么它可以綁定到以下任何環(huán)境屬性:
- sampleProp
- sample-Prop
- sample_Prop
- SAMPLE_PROP
Spring Boot 中的自動(dòng)配置有什么理解? 如何禁用自動(dòng)配置?
Auto-configuration 用于自動(dòng)配置應(yīng)用程序所需的配置。 例如, 如果在應(yīng)用程序的類(lèi)路徑中有一個(gè)數(shù)據(jù)源 Bean, 那么它會(huì)自動(dòng)配置 JDBC 模板。 在自動(dòng)配置的幫助下, 您可以輕松地創(chuàng)建 Java 應(yīng)用程序, 因?yàn)樗梢宰詣?dòng)配置所需的 Bean、 控制器等。
要禁用自動(dòng)配置屬性, 您必須排除 @EnableAutoConfiguration 屬性, 在不希望應(yīng)用該屬性的場(chǎng)景中。
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}
如果類(lèi)不在類(lèi)路徑中, 那么要排除自動(dòng)配置, 你必須提到以下代碼:
@EnableAutoConfiguration(excludeName={Sample.class})
除此之外, Spring Boot 還提供了通過(guò)使用 Spring .autoconfigure.exclude 屬性來(lái)排除自動(dòng)配置類(lèi)列表的功能。 您可以繼續(xù), 并將其添加到應(yīng)用程序中, 屬性或添加以逗號(hào)分隔的多個(gè)類(lèi)
在 Spring Boot 中 @RequestMapping 和@RestController 注釋的用途是什么?
@RequestMapping:
- 該注釋用于提供路由信息, 并告訴 Spring 任何HTTP 請(qǐng)求都必須映射到相應(yīng)的方法。
- 要使用這個(gè)注釋, 您必須導(dǎo)入org.springframework.web.bind.annotation.RequestMapping;
@RestController:
- 此注釋用于將 @ResponseBody 和@Controller 注釋添加到類(lèi)中
- 要使用這個(gè)注釋, 您必須導(dǎo)入org.springframework.web.bind.annotation.RestController;
如何在 Spring Boot 中啟用 HTTP/2 支持
您可以在 Spring Boot by 中啟用 HTTP/2 支持:server.http2.enabled=trueSpring Boot 2默認(rèn)數(shù)據(jù)庫(kù)連接池選擇了HikariCPSpring Boot 還提供了其它的哪些 Starter Project Options?
Spring Boot 也提供了其它的啟動(dòng)器項(xiàng)目包括,包括用于開(kāi)發(fā)特定類(lèi)型應(yīng)用程序的典型依賴項(xiàng)。
- spring-boot-starter-web-services - SOAP Web Services;
- spring-boot-starter-web - Web 和 RESTful 應(yīng)用程序;
- spring-boot-starter-test - 單元測(cè)試和集成測(cè)試;
- spring-boot-starter-jdbc - 傳統(tǒng)的 JDBC;
- spring-boot-starter-hateoas - 為服務(wù)添加 HATEOAS 功能;
- spring-boot-starter-security - 使用 SpringSecurity 進(jìn)行身份驗(yàn)證和授權(quán);
- spring-boot-starter-data-jpa - 帶有 Hibeernate 的 Spring Data JPA;
- spring-boot-starter-data-rest - 使用 Spring Data REST 公布簡(jiǎn)單的 REST 服務(wù);
為什么要用 Spring Boot?
- (1)簡(jiǎn)化配置,不需要編寫(xiě)太多的xml配置文件;
- (2)基于Spring構(gòu)建,使開(kāi)發(fā)者快速入門(mén),門(mén)檻很低;
- (3)SpringBoot可以創(chuàng)建獨(dú)立運(yùn)行的應(yīng)用而不需要依賴于容器;
- (4)內(nèi)置tomcat服務(wù)器,不需要打包成war包,可以直接放到tomcat中運(yùn)行;
- (5)提供maven極簡(jiǎn)配置,以及可視化的相關(guān)監(jiān)控功能,比如性能監(jiān)控,應(yīng)用的健康程度等;
- (6)為微服務(wù)SpringCloud奠定了基礎(chǔ),使得微服務(wù)的構(gòu)建變得簡(jiǎn)單;
- (7)Spring可以整合很多各式各樣的框架,并能很好的集成;
Spring Boot 的核心配置文件有哪幾個(gè)?它們的區(qū)別是什么?
SpringBoot的核心配置文件有application和bootstarp配置文件。
- application文件主要用于Springboot自動(dòng)化配置文件。
- bootstarp文件主要有以下幾種用途:
- 使用Spring Cloud Config注冊(cè)中心時(shí) 需要在bootStarp配置文件中添加鏈接到配置中心的配置屬性來(lái)加載外部配置中心的配置信息。
- 一些固定的不能被覆蓋的屬性
- 一些加密/解密的場(chǎng)景
Spring Boot 的配置文件有哪幾種格式?它們有什么區(qū)別?
properties 和 .yml,它們的區(qū)別主要是書(shū)寫(xiě)格式不同。
??? 1).properties: app.user.name = javastack
??? 2).yml
??? app:
????? user:
??? name: javastack
另外,.yml 格式不支持 @PropertySource 注解導(dǎo)入配置。
Spring Boot 的核心注解是哪個(gè)?它主要由哪幾個(gè)注解組成的?
- @SpringBootConfigurationa(加載的bean):加載相關(guān)的類(lèi)中添加了@CompenScan+、@Repository、@Service、@Compent、@Controller類(lèi)到beandefinitionMap中
- @EnableAutoConfigurationa(自動(dòng)配置的類(lèi)):@Import就是加載的INF下面的Spring.Factory的相關(guān)的配置類(lèi)到beandefinitionMap的加載氣的配置類(lèi)。這里里面涉及到SPI技術(shù)。
- @Componentscan(掃描包)
開(kāi)啟 Spring Boot 特性有哪幾種方式?
- 1)繼承spring-boot-starter-parent項(xiàng)目
- 2)導(dǎo)入spring-boot-dependencies項(xiàng)目依賴
Spring Boot 需要獨(dú)立的容器運(yùn)行嗎?
- 可以不需要,內(nèi)置了 Tomcat/ Jetty 等容器。
運(yùn)行 Spring Boot 有哪幾種方式?
- 打包用命令或者放到容器中運(yùn)行
- 用 Maven/ Gradle 插件運(yùn)行
- 直接執(zhí)行 main 方法運(yùn)行
Spring Boot 自動(dòng)配置原理是什么?
在分析原理之前先來(lái)整體的看一下自動(dòng)配置的核心原理圖,作一個(gè)簡(jiǎn)單的了解。\
簡(jiǎn)單來(lái)說(shuō),Spring Boot通過(guò)@EnableAutoConfiguration注解開(kāi)啟自動(dòng)配置,對(duì)jar包下的spring.factories文件進(jìn)行掃描,這個(gè)文件中包含了可以進(jìn)行自動(dòng)配置的類(lèi),當(dāng)滿足@Condition注解指定的條件時(shí),便在依賴的支持下進(jìn)行實(shí)例化,注冊(cè)到Spring容器中。
在啟動(dòng)類(lèi)中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,是一個(gè)組合注解。我們進(jìn)入這個(gè)注解可以看到里面又包含了其它很多注解,但其中@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個(gè)注解尤為重要。
@SpringBootConfiguration:繼承自Configuration,支持JavaConfig的方式進(jìn)行配置。
@EnableAutoConfiguration:@Import就是加載的INF下面的Spring.Factory的相關(guān)的配置類(lèi)到beandefinitionMap的加載氣的配置類(lèi)。這里里面涉及到SPI技術(shù)。
@ComponentScan:自動(dòng)掃描組件,默認(rèn)掃描該類(lèi)所在包及其子包下所有帶有指定注解的類(lèi),將它們自動(dòng)裝配到bean容器中,會(huì)被自動(dòng)裝配的注解包括@Controller、@Service、@Component、@Repository等。也可以指定掃描路徑。
@EnableAutoConfiguration
繼續(xù)進(jìn)入@EnableAutoConfiguration,注意到這兩個(gè)注解:@AutoConfigurationPackage和@Import,這里我們需要關(guān)心的是這個(gè)@Import注解.
@Import
觀察@Import(AutoConfigurationImportSelector.class)注解,這里導(dǎo)入了AutoConfigurationImportSelector類(lèi)。這個(gè)類(lèi)中有一個(gè)非常重要的方法——selectImports(),它幾乎涵蓋了組件自動(dòng)裝配的所有處理邏輯,包括獲得候選配置類(lèi)、配置類(lèi)去重、排除不需要的配置類(lèi)、過(guò)濾等,最終返回符合條件的自動(dòng)配置類(lèi)的全限定名數(shù)組。下面源碼圖中對(duì)該方法進(jìn)行了詳盡的注釋。
?
這里需要關(guān)注的的是如何得到候選的配置類(lèi),可以看到所有的配置信息通過(guò)getCandidateConfigurations()得到,并最終由一個(gè)列表保存。我們繼續(xù)查看getCandidateConfigurations()方法。
繼續(xù)進(jìn)入loadFactoryNames()方法,可以發(fā)現(xiàn)一個(gè)獲取資源的可疑地址:FACTORIES_RESOURCE_LOCATION
再進(jìn)入FACTORIES_RESOURCE_LOCATION,發(fā)現(xiàn)值為:META-INF/spring.factories
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";?簡(jiǎn)述以上過(guò)程就是:getCandidateConfigurations()方法通過(guò)SpringFactoriesLoader加載器加載META-INF/spring.factories文件,通過(guò)這個(gè)文件獲取到每個(gè)配置類(lèi)的url,再通過(guò)這些url將它們封裝成Properties對(duì)象,最后解析內(nèi)容存于Map<String,List<String>>中。
下面是spring.factories文件的內(nèi)容格式,根據(jù)它我們可以清晰地了解Map<String,List<String>>中都存了些什么。其中Key值為:org.springframework.boot.autoconfigure.EnableAutoConfiguration,Value值為后面的各種XXXAutoConfiguration類(lèi)。
最后通過(guò)loadFactoryNames傳遞過(guò)來(lái)的class名稱作為Key從Map中獲得該類(lèi)的配置列表,而這個(gè)class名稱是什么呢?回到之前的SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())方法,注意第一個(gè)參數(shù),是一個(gè)方法,我們進(jìn)入這個(gè)方法,發(fā)現(xiàn)返回的是EnableAutoConfiguration.class,這即是我們需要的class名稱。
/** * Return the class used by {@link SpringFactoriesLoader} to load configuration * candidates. * @return the factory class */ protected Class<?> getSpringFactoriesLoaderFactoryClass() {return EnableAutoConfiguration.class; }最終,getCandidateConfigurations()方法獲取到了候選配置類(lèi)并存于List中。之所以說(shuō)是“候選”,是因?yàn)樗鼈兒罄m(xù)還需要經(jīng)過(guò)一系列的去重、排除、過(guò)濾等操作,最終會(huì)通過(guò)selectImports()方法返回一個(gè)自動(dòng)配置類(lèi)的全限定名數(shù)組。
Spring Boot 的目錄結(jié)構(gòu)是怎樣的?
src/main/java:存放代碼
src/main/resources
- resources:(Spring Boot 默認(rèn)的)存放資源文件
- static:(Spring Boot 默認(rèn)的)存放靜態(tài)文件,比如 css、js、image, (訪問(wèn)方式 http://localhost:8080/js/main.js)
- public:(Spring Boot 默認(rèn)的)存放公共文件
- templates:(用戶自己定義的,可以隨便取名,但這里使用公認(rèn)的文件名)存放靜態(tài)頁(yè)面,比如 jsp、html、tpl
- config:(用戶自己定義的,可以隨便取名,但這里使用公認(rèn)的文件名)存放配置文件,比如 application.properties
你如何理解 Spring Boot 中的 Starters?
- Starters可以理解為啟動(dòng)器,它包含了一系列可以集成到應(yīng)用里面的依賴包,你可以一站式集成 Spring 及其他技術(shù),而不需要到處找示例代碼和依賴包。如你想使用 Spring JPA 訪問(wèn)數(shù)據(jù)庫(kù),只要加入 spring-boot-starter-data-jpa 啟動(dòng)器依賴就能使用了。
- Starters包含了許多項(xiàng)目中需要用到的依賴,它們能快速持續(xù)的運(yùn)行,都是一系列得到支持的管理傳遞性依賴。
如何在 Spring Boot 啟動(dòng)的時(shí)候運(yùn)行一些特定的代碼?
可以實(shí)現(xiàn)接口 ApplicationRunner 或者 CommandLineRunner,這兩個(gè)接口實(shí)現(xiàn)方式一樣,它們都只提供了一個(gè) run 方法。如果啟動(dòng)的時(shí)候有多個(gè)ApplicationRunner和CommandLineRunner,想控制它們的啟動(dòng)順序,可以實(shí)現(xiàn) org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解。
@FunctionalInterface public interface CommandLineRunner {/*** Callback used to run the bean.* @param args incoming main method arguments* @throws Exception on error*/void run(String... args) throws Exception;}@FunctionalInterface public interface ApplicationRunner {/*** Callback used to run the bean.* @param args incoming application arguments* @throws Exception on error*/void run(ApplicationArguments args) throws Exception;}---------------------------------------------------------------------------------------------------------- import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component;@Component public class MyBean implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// Do something...} }@Bean public CommandLineRunner init() {return (String... strings) -> {};}Spring Boot 有哪幾種讀取配置的方式?
從以上示例來(lái)看,Spring Boot可以通過(guò)@PropertySource,@Value,@Environment,@ConfigurationProperties來(lái)綁定變量。
讀取application文件
在application.yml或者properties文件中添加:
info.address=USA info.company=Spring info.degree=high1、@Value注解讀取方式
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;@Component public class InfoConfig1 {@Value("${info.address}")private String address;@Value("${info.company}")private String company;@Value("${info.degree}")private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree = degree;} }2、@ConfigurationProperties注解讀取方式
@Component @ConfigurationProperties(prefix = "info") public class InfoConfig2 {private String address;private String company;private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree = degree;} }讀取指定文件
資源目錄下建立config/db-config.properties:
db.username=root db.password=1234561、@PropertySource+@Value注解讀取方式:注意:@PropertySource不支持yml文件讀取。
@Component @PropertySource(value = {"config/db-config.properties"}) public class DBConfig1 {@Value("${db.username}")private String username;@Value("${db.password}")private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;} }2、@PropertySource+@ConfigurationProperties注解讀取方式
@Component @ConfigurationProperties(prefix = "db") @PropertySource(value = {"config/db-config.properties"}) public class DBConfig2 {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;} }Environment讀取方式
以上所有加載出來(lái)的配置都可以通過(guò)Environment注入獲取到。
@Autowired private Environment env;//獲取參數(shù) String getProperty(String key);Spring Boot 支持哪些日志框架?推薦和默認(rèn)的日志框架是哪個(gè)?
Spring Boot在所有內(nèi)部日志中使用Commons Logging,但是默認(rèn)配置也提供了對(duì)常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過(guò)配置使用控制臺(tái)或者文件輸出日志內(nèi)容。
SLF4J——Simple Logging Facade For Java,它是一個(gè)針對(duì)于各類(lèi)Java日志框架的統(tǒng)一Facade抽象。Java日志框架眾多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定義了統(tǒng)一的日志抽象接口,而真正的日志實(shí)現(xiàn)則是在運(yùn)行時(shí)決定的——它提供了各類(lèi)日志框架的binding。
Logback是log4j框架的作者開(kāi)發(fā)的新一代日志框架,它效率更高、能夠適應(yīng)諸多的運(yùn)行環(huán)境,同時(shí)天然支持SLF4J。
默認(rèn)情況下,Spring Boot會(huì)用Logback來(lái)記錄日志,并用INFO級(jí)別輸出到控制臺(tái)。在運(yùn)行應(yīng)用程序和其他例子時(shí),你應(yīng)該已經(jīng)看到很多INFO級(jí)別的日志了。
SpringBoot 實(shí)現(xiàn)熱部署有哪幾種方式?
SpringBoot熱部署方式一共有兩種,分別使用兩種不同的依賴。SpringBoot 1.3后才擁有SpringBoot devtools熱部署
①:spring-boot-devtools? ?②:Spring Loaded
在項(xiàng)目的pom文件中添加依賴:
1 <!--熱部署jar--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 </dependency> <build><plugins><plugin><!-- springBoot編譯插件--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><!-- spring熱部署 --><!-- 該依賴在此處下載不下來(lái),可以放置在build標(biāo)簽外部下載完成后再粘貼進(jìn)plugin中 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><version>1.2.6.RELEASE</version></dependency></dependencies></plugin></plugins> </build>你如何理解 Spring Boot 配置加載順序?
1、開(kāi)發(fā)者工具 `Devtools` 全局配置參數(shù);2、單元測(cè)試上的 `@TestPropertySource` 注解指定的參數(shù);3、單元測(cè)試上的 `@SpringBootTest` 注解指定的參數(shù);4、命令行指定的參數(shù),如 `java -jar springboot.jar --name="Java技術(shù)棧"`;5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定參數(shù), 如 `java -Dspring.application.json='{"name":"Java技術(shù)棧"}' -jar springboot.jar`6、`ServletConfig` 初始化參數(shù);7、`ServletContext` 初始化參數(shù);8、JNDI參數(shù)(如 `java:comp/env/spring.application.json`);9、Java系統(tǒng)參數(shù)(來(lái)源:`System.getProperties()`);10、操作系統(tǒng)環(huán)境變量參數(shù);11、`RandomValuePropertySource` 隨機(jī)數(shù),僅匹配:`ramdom.*`;12、JAR包外面的配置文件參數(shù)(`application-{profile}.properties(YAML)`)13、JAR包里面的配置文件參數(shù)(`application-{profile}.properties(YAML)`)14、JAR包外面的配置文件參數(shù)(`application.properties(YAML)`)15、JAR包里面的配置文件參數(shù)(`application.properties(YAML)`)16、`@Configuration`配置文件上 `@PropertySource` 注解加載的參數(shù);17、默認(rèn)參數(shù)(通過(guò) `SpringApplication.setDefaultProperties` 指定);Spring Boot 如何定義多套不同環(huán)境配置?
profile配置方式有兩種:
- ·多profile文件方式:提供多個(gè)配置文件,每個(gè)代表一種環(huán)境。
- ·application-dev.properties/yml 開(kāi)發(fā)環(huán)境
- ·application-test.properties/yml 測(cè)試環(huán)境
- ·application-pro.properties/yml 生產(chǎn)環(huán)境
profile激活三種方式:
- ·配置文件: 再配置文件中配置:spring.profiles.active=dev
- ·虛擬機(jī)參數(shù):在VM options 指定:-Dspring.profiles.active=dev
- ·命令行參數(shù):java –jar xxx.jar --spring.profiles.active=dev
但是考慮到一個(gè)問(wèn)題,生產(chǎn)環(huán)境的配置文件的安全性,顯然我們不能,也不應(yīng)該把生產(chǎn)環(huán)境的配置文件放到項(xiàng)目倉(cāng)庫(kù)Git中,進(jìn)行管理。一般我們將生產(chǎn)環(huán)境的配置文件放到生產(chǎn)環(huán)境的服務(wù)器中,以固定命令執(zhí)行啟動(dòng):java -jar myboot.jar --spring.config.location=/xx/yy/xx/application-prod.properties。或者,使用Jenkins在執(zhí)行打包,配置上maven profile功能,使用服務(wù)器的配置文件。最后一種方式,使用配置中心管理配置文件;
Spring Boot 可以兼容老 Spring 項(xiàng)目嗎,如何做?
可以兼容,使用 @ImportResource 注解導(dǎo)??Spring 項(xiàng)目配置?件
保護(hù) Spring Boot 應(yīng)用有哪些方法?
使用的Https保證安全
傳輸層安全性(TLS)是HTTPS的官方名稱,你可能聽(tīng)說(shuō)過(guò)它稱為SSL(安全套接字層),SSL是已棄用的名稱,TLS是一種加密協(xié)議,可通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)提供安全通信。其主要目標(biāo)是確保計(jì)算機(jī)應(yīng)用程序之間的隱私和數(shù)據(jù)完整性。過(guò)去,TLS / SSL證書(shū)很昂貴,而且HTTPS被認(rèn)為很慢,現(xiàn)在機(jī)器變得更快,已經(jīng)解決了性能問(wèn)題,Let's Encrypt提供免費(fèi)的TLS證書(shū),這兩項(xiàng)發(fā)展改變了游戲,并使TLS成為主流。要在Spring Boot應(yīng)用程序中強(qiáng)制使用HTTPS,您可以擴(kuò)展WebSecurityConfigurerAdapter并要求安全連接。
@Configuration public class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.requiresChannel().requiresSecure();}}使用Snyk檢查你的依賴關(guān)系
你很可能不知道應(yīng)用程序使用了多少直接依賴項(xiàng),這通常是正確的,盡管依賴性構(gòu)成了整個(gè)應(yīng)用程序的大部分。攻擊者越來(lái)越多地針對(duì)開(kāi)源依賴項(xiàng),因?yàn)樗鼈兊闹赜脼閻阂夂诳吞峁┝嗽S多受害者,確保應(yīng)用程序的整個(gè)依賴關(guān)系樹(shù)中沒(méi)有已知的漏洞非常重要。
Snyk測(cè)試你的應(yīng)用程序構(gòu)建包,標(biāo)記那些已知漏洞的依賴項(xiàng)。它在儀表板在應(yīng)用程序中使用的軟件包中存在的漏洞列表。此外,它還將建議升級(jí)的版本或提供補(bǔ)丁,并提供針對(duì)源代碼存儲(chǔ)庫(kù)的拉取請(qǐng)求來(lái)修復(fù)您的安全問(wèn)題。Snyk還確保在你的存儲(chǔ)庫(kù)上提交的任何拉取請(qǐng)求(通過(guò)webhooks)時(shí)都是通過(guò)自動(dòng)測(cè)試的,以確保它們不會(huì)引入新的已知漏洞。每天都會(huì)在現(xiàn)有項(xiàng)目和庫(kù)中發(fā)現(xiàn)新的漏洞,因此監(jiān)控和保護(hù)生產(chǎn)部署也很重要。Snyk拍攝快照并監(jiān)控你的部署,以便在發(fā)現(xiàn)新漏洞時(shí),你可以通過(guò)JIRA,slack或電子郵件自動(dòng)收到通知,并創(chuàng)建拉取請(qǐng)求以提供新漏洞的升級(jí)和補(bǔ)丁。Snyk可通過(guò)Web UI和CLI獲得,因此您可以輕松地將其與CI環(huán)境集成,并將其配置為在存在嚴(yán)重性超出設(shè)定閾值的漏洞時(shí)中斷構(gòu)建。你可以免費(fèi)使用Snyk進(jìn)行開(kāi)源項(xiàng)目或使用有限數(shù)量的私有項(xiàng)目。
升級(jí)更新新的版本
定期升級(jí)應(yīng)用程序中的依賴項(xiàng)有多種原因。安全性是讓您有升級(jí)動(dòng)力的最重要原因之一。該start.spring.io起始頁(yè)面采用了最新的春季版本的軟件包,以及依賴關(guān)系,在可能的情況。基礎(chǔ)架構(gòu)升級(jí)通常不如依賴項(xiàng)升級(jí)具有破壞性,因?yàn)閹?kù)作者對(duì)向后兼容性和版本之間的行為更改的敏感性各不相同。話雖如此,當(dāng)你在配置中發(fā)現(xiàn)安全漏洞時(shí),您有三種選擇:升級(jí),修補(bǔ)程序或忽略。在對(duì)應(yīng)用程序進(jìn)行必要的更改以使用較新版本之后,就應(yīng)用程序的整體運(yùn)行狀況而言,升級(jí)是最安全的。
啟用CSRF保護(hù)
跨站點(diǎn)請(qǐng)求偽造(Cross-Site Request Forgery )是一種攻擊,強(qiáng)制用戶在他們當(dāng)前登錄的應(yīng)用程序中執(zhí)行不需要的操作。如果用戶是普通用戶,一個(gè)成功攻擊可能涉及請(qǐng)求的狀態(tài)更改,如轉(zhuǎn)移資金或更改其電子郵件地址,如果用戶具有提升管理員的權(quán)限,則CSRF攻擊可能會(huì)危及整個(gè)應(yīng)用程序。Spring Security具有出色的CSRF支持,如果您正在使用Spring MVC的<form:form>標(biāo)簽或Thymeleaf @EnableWebSecurity,默認(rèn)情況下處于啟用狀態(tài),CSRF令牌將自動(dòng)添加為隱藏輸入字段。如果你使用的是像Angular或React這樣的JavaScript框架,則需要配置CookieCsrfTokenRepository以便JavaScript可以讀取cookie。如果你正在使用Angular,這就是你需要做的。如果您使用的是React,則需要讀取XSRF-TOKENcookie并將其作為X-XSRF-TOKEN標(biāo)題發(fā)回。當(dāng)請(qǐng)求通過(guò)HTTPS發(fā)生時(shí),Spring Security會(huì)自動(dòng)加入一個(gè)secure標(biāo)識(shí)到XSRF-TOKENcookie 。Spring Security對(duì)于CSRF cookie不使用SameSite=strict 的標(biāo)志,但它在使用Spring Session或WebFlux會(huì)話處理時(shí)會(huì)使用,這對(duì)會(huì)話cookie有意義,因?yàn)樗兄谧R(shí)別用戶,但是沒(méi)有為CSRF cookie提供太多價(jià)值,因?yàn)镃SRF令牌也需要在請(qǐng)求中。
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}}使用內(nèi)容安全策略防止XSS攻擊
CSP是防止XSS攻擊的良好防御,請(qǐng)記住,打開(kāi)CSP能讓CDN訪問(wèn)許多非常古老且易受攻擊的JavaScript庫(kù),這意味著使用CDN不會(huì)為安全性增加太多價(jià)值。內(nèi)容安全策略(CSP)是一個(gè)增加的安全層,可幫助緩解XSS(跨站點(diǎn)腳本)和數(shù)據(jù)注入攻擊。要啟用它,你需要配置應(yīng)用程序以返回Content-Security-Policy標(biāo)題。你還可以在HTML頁(yè)面中<meta http-equiv="Content-Security-Policy">使用標(biāo)記。
Spring安全性默認(rèn)提供了許多安全標(biāo)頭:
使用OpenID Connect進(jìn)行身份驗(yàn)證
OAuth 2.0是行業(yè)標(biāo)準(zhǔn)的授權(quán)協(xié)議。它使用scope來(lái)定義授權(quán)用戶可以執(zhí)行的操作的權(quán)限。但是,OAuth 2.0不是身份驗(yàn)證協(xié)議,并且不提供有關(guān)經(jīng)過(guò)身份驗(yàn)證的用戶的信息。OpenID Connect(OIDC)是一個(gè)OAuth 2.0擴(kuò)展,提供用戶信息,除了訪問(wèn)令牌之外,它還添加了ID令牌,以及/userinfo可以從中獲取其他信息的端點(diǎn),它還添加了發(fā)現(xiàn)功能和動(dòng)態(tài)客戶端注冊(cè)的端點(diǎn)。如果使用OIDC進(jìn)行身份驗(yàn)證,則無(wú)需擔(dān)心如何存儲(chǔ)用戶、密碼或?qū)τ脩暨M(jìn)行身份驗(yàn)證。相反,你可以使用身份提供商(IdP)為你執(zhí)行此操作,你的IdP甚至可能提供多因素身份驗(yàn)證(MFA)等安全附加組件。要了解如何在Spring Boot應(yīng)用程序中使用OIDC,請(qǐng)參閱Spring Security 5.0和OIDC入門(mén)。要總結(jié)如何使用它,你需要向項(xiàng)目添加一些依賴項(xiàng),然后在application.yml文件中配置一些屬性。
spring:security:oauth2:client:registration:okta:client-id: {clientId}client-secret: {clientSecret}scope: openid email profileprovider:okta:issuer-uri: https://{yourOktaDomain}/oauth2/default管理密碼?使用密碼哈希!
以純文本格式存儲(chǔ)密碼是最糟糕的事情之一。幸運(yùn)的是,Spring Security默認(rèn)情況下不允許使用純文本密碼。它還附帶了一個(gè)加密模塊,可用于對(duì)稱加密,生成密鑰和密碼散列(也就是密碼編碼)。PasswordEncoder 是Spring Security中密碼哈希的主要接口,如下所示:
public interface PasswordEncoder {String encode(String rawPassword);boolean matches(String rawPassword, String encodedPassword);}Spring Security提供了幾種實(shí)現(xiàn),最受歡迎的是BCryptPasswordEncoder和Pbkdf2PasswordEncoder。對(duì)于一般的密碼管理,我們建議使用SCrypt或Argon2, SCrypt現(xiàn)在已經(jīng)過(guò)時(shí)了(已經(jīng)有一段時(shí)間了),并且有一個(gè)額外的復(fù)雜因素,BCrypt沒(méi)有這個(gè)因素,這使得暴力破解變得加倍地困難。它由著名的密碼學(xué)家/安全人員(Colin Percival)編寫(xiě),在幾乎所有編程語(yǔ)言中都有很好的庫(kù),SCrypt也得到Latacora的認(rèn)可。Spring Security 5.1(即2018年9月下旬)將附帶UserDetailsPasswordService API,允許您升級(jí)密碼存儲(chǔ)。
安全地存儲(chǔ)秘密
應(yīng)謹(jǐn)慎處理敏感信息,如密碼,訪問(wèn)令牌等,你不能以純文本形式傳遞,或者如果將它們保存在本地存儲(chǔ)中。由于(GitHub)的歷史已經(jīng)一次又一次證明,開(kāi)發(fā)人員并沒(méi)有仔細(xì)考慮如何存儲(chǔ)他們的秘密。一個(gè)好的做法是將保密信息存儲(chǔ)在保管庫(kù)中,該保管庫(kù)可用于存儲(chǔ),提供對(duì)應(yīng)用程序可能使用的服務(wù)的訪問(wèn)權(quán)限,甚至生成憑據(jù)。HashiCorp的Vault使得存儲(chǔ)機(jī)密變得很輕松,并提供了許多額外的服務(wù)。如果您對(duì)此感興趣,請(qǐng)務(wù)必花一些時(shí)間查看Spring Vault,它為HashiCorp Vault添加抽象,為客戶提供基于Spring注釋的訪問(wèn),允許他們?cè)L問(wèn)、存儲(chǔ)和撤銷(xiāo)機(jī)密而不會(huì)迷失在基礎(chǔ)架構(gòu)中。以下代碼段顯示了使用注釋從Spring Vault中提取密碼的方便程度。
@Value("${password}") String password;使用OWASP的ZAP測(cè)試您的應(yīng)用程序
OWASP ZAP安全工具是針對(duì)在運(yùn)行活動(dòng)的應(yīng)用程序進(jìn)行滲透測(cè)試的代理。它是一個(gè)受歡迎的(超過(guò)4k星)免費(fèi)的開(kāi)源項(xiàng)目,托管在GitHub上。OWASP ZAP用于查找漏洞的兩種方法是Spider和Active Scan。Spider工具以URL種子開(kāi)頭,它將訪問(wèn)并解析每個(gè)響應(yīng),識(shí)別超鏈接并將它們添加到列表中。然后,它將訪問(wèn)這些新找到的URL并以遞歸方式繼續(xù),為您的Web應(yīng)用程序創(chuàng)建URL映射。Active Scan工具將根據(jù)潛在漏洞列表自動(dòng)測(cè)試你選擇的目標(biāo)。它提供了一個(gè)報(bào)告,顯示W(wǎng)eb應(yīng)用程序可被利用的位置以及有關(guān)漏洞的詳細(xì)信息。
讓你的安全團(tuán)隊(duì)進(jìn)行代碼審查
代碼評(píng)審對(duì)任何高性能軟件開(kāi)發(fā)團(tuán)隊(duì)都至關(guān)重要。在Okta,我們所有的生產(chǎn)代碼和官方開(kāi)源項(xiàng)目都需要通過(guò)我們的專家安全團(tuán)隊(duì)進(jìn)行分析,你的公司可能沒(méi)有安全專家,但如果你正在處理敏感數(shù)據(jù),也許你應(yīng)該這樣做!
Spring Boot 2.X 有什么新特性?與 1.X 有什么區(qū)別?
配置變更
- 在 2.x 中廢除了一些 1.x 中的配置,并增加了許多新配置,詳細(xì)請(qǐng)查看以下鏈接中的變更表格。
JDK 版本升級(jí)
- 2.x 至少需要 JDK 8 的支持,2.x 里面的許多方法應(yīng)用了 JDK 8 的許多高級(jí)新特性,所以你要升級(jí)到 2.0 版本,先確認(rèn)你的應(yīng)用必須兼容 JDK 8。另外,2.x 開(kāi)始了對(duì) JDK 9 的支持。
第三方類(lèi)庫(kù)升級(jí)
- 1) Spring Framework 5+
- 2) Tomcat 8.5+
- 3) Flyway 5+
- 4) Hibernate 5.2+
- 5) Thymeleaf 3+
響應(yīng)式 Spring 編程支持
- 2.x 通過(guò)啟動(dòng)器和自動(dòng)配置全面支持 Spring 的響應(yīng)式編程,響應(yīng)式編程是完全異步和非阻塞的,它是基于事件驅(qū)動(dòng)模型,而不是傳統(tǒng)的線程模型。就連 Spring Boot 內(nèi)部也對(duì)一些功能點(diǎn)進(jìn)行了有必要的響應(yīng)式升級(jí),最值得注意的是對(duì)內(nèi)嵌式容器的支持。
HTTP/2 支持
- 提供對(duì)HTTP/2 的支持,如:Tomcat, Undertow, Jetty,這個(gè)得依賴具體選擇的應(yīng)用服務(wù)器和應(yīng)用環(huán)境。
配置屬性綁定
- 在 1.x 中,配置綁定是通過(guò)注解 @ConfigurationProperties 來(lái)注入到 Spring 環(huán)境變量中的。在 2.x 中,配置綁定功能有了些的改造,在調(diào)整了 1.x 中許多不一致地方之外,還提供了獨(dú)立于注解之外的 API 來(lái)裝配配置屬性。并增加了屬性來(lái)源,這樣你就能知道這些屬性是從哪個(gè)配置文件中加載進(jìn)來(lái)的。
Gradle 插件
- Spring Boot的 Gradle 插件全面重寫(xiě)了,并且最小支持 Gradle 4+ 以便提供一些重要的特性提升。
Kotlin
- 2.x 開(kāi)始提供對(duì) Kotlin 1.2 的支持,并且提供了一個(gè) runApplication 函數(shù)來(lái)運(yùn)行 Spring Boot 應(yīng)用。
Spring Boot 有哪些優(yōu)點(diǎn)?
1、獨(dú)立運(yùn)行:SpringBoot而且內(nèi)嵌了各種servlet容器, Tomcat、Jetty等 ,現(xiàn)在不再需要打成war包部署 到容器中,Spring Boot只要打成- -個(gè)可執(zhí)行的jar包就能獨(dú)立運(yùn)行,所有的依賴包都在一個(gè)jar包內(nèi)。
2、簡(jiǎn)化配置:spring- boot- starter-web啟動(dòng)器自動(dòng)依賴其他組件,簡(jiǎn)少了maven的配置。
3、自動(dòng)配置:Spring Boot能根據(jù)當(dāng)前類(lèi)路徑下的類(lèi)、jar包來(lái) 自 動(dòng)配置bean,如添加一個(gè)spring-boot- -starter-web啟動(dòng)器就能擁有web的功能,無(wú)需其他配置。
4、無(wú)代碼生成和XML配置:Spring Boot配置過(guò)程中無(wú)代碼生成,也無(wú)需XML配置文件就能完成所有配置工作,這一切都是借助于條件注解完成的,這也是Spring4.x的核心功能之一。
5、應(yīng)用監(jiān)控:Spring Boot提供一系列端點(diǎn)可以監(jiān)控服務(wù)及應(yīng)用,做健康檢測(cè)。
Spring Boot的缺點(diǎn):Spring Boot 雖然上手很容易,但如果你不了解其核心技術(shù)及流程,所以一旦遇到問(wèn)題就很棘手,而且現(xiàn)在的解決方案也不是很多,需要一個(gè)完善的過(guò)程。
什么是 JavaConfig?
Spring JavaConfig是Spring社區(qū)的產(chǎn)品,他提供了配置Spring IOC容器的純Java方法。因此它有助于避免使用XML配置。
1.面向?qū)ο蟮呐渲?#xff1a;由于配置被定義為JavaConfig中的類(lèi),因此用戶可以充分使用Java中的面向?qū)ο蠊δ堋R粋€(gè)配置類(lèi)可以繼承另一個(gè),重寫(xiě)它的@Bean方法等。
2.減少或者消除XML配置:提供了一種純Java的方法來(lái)配置與XML配置概念相似的Spring容器。
3.類(lèi)型安全和重構(gòu)友好:提供了一種類(lèi)型安全的方法了來(lái)配置spring容器,由于Java5.0對(duì)泛型的支持,現(xiàn)在可以按類(lèi)型而不是名稱檢索bean,不需要任何的強(qiáng)制轉(zhuǎn)換或者基于字符串的查找。
如何重新加載 Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器?
這可以使用 DEV 工具來(lái)實(shí)現(xiàn)。通過(guò)這種依賴關(guān)系,您可以節(jié)省任何更改,嵌入式 tomcat將重新啟動(dòng)。Spring Boot 有一個(gè)開(kāi)發(fā)工具(DevTools)模塊,它有助于提高開(kāi)發(fā)人員的生產(chǎn)力。Java 開(kāi)發(fā)人員面臨的一個(gè)主要挑戰(zhàn)是將文件更改自動(dòng)部署到服務(wù)器并自動(dòng)重啟服務(wù)器。開(kāi)發(fā)人員可以重新加載 Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器。這將消除每次手動(dòng)部署更改的需要。Spring Boot 在發(fā)布它的第一個(gè)版本時(shí)沒(méi)有這個(gè)功能。這是開(kāi)發(fā)人員最需要的功能。DevTools 模塊完全滿足開(kāi)發(fā)人員的需求。該模塊將在生產(chǎn)環(huán)境中被禁用。它還提供 H2 數(shù)據(jù)庫(kù)控制臺(tái)以更好地測(cè)試應(yīng)用程序。
SpringBoot熱部署方式一共有兩種,分別使用兩種不同的依賴。SpringBoot 1.3后才擁有SpringBoot devtools熱部署
①:spring-boot-devtools? ?②:Spring Loaded
在項(xiàng)目的pom文件中添加依賴:
1 <!--熱部署jar--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 </dependency> <build><plugins><plugin><!-- springBoot編譯插件--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><!-- spring熱部署 --><!-- 該依賴在此處下載不下來(lái),可以放置在build標(biāo)簽外部下載完成后再粘貼進(jìn)plugin中 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><version>1.2.6.RELEASE</version></dependency></dependencies></plugin></plugins> </build>Spring Boot 中的監(jiān)視器是什么?
Spring boot actuator是 spring啟動(dòng)框架中的重要功能之一。Spring boot監(jiān)視器可幫助您訪問(wèn)生產(chǎn)環(huán)境中正在運(yùn)行的應(yīng)用程序的當(dāng)前狀態(tài)。有幾個(gè)指標(biāo)必須在生產(chǎn)環(huán)境中進(jìn)行檢查和監(jiān)控。即使一些外部應(yīng)用程序可能正在使用這些服務(wù)來(lái)向相關(guān)人員觸發(fā)警報(bào)消息。監(jiān)視器模塊公開(kāi)了一組可直接作為HTTP URL 訪問(wèn)的REST端點(diǎn)來(lái)檢查狀態(tài)。
如何在 Spring Boot 中禁用 Actuator 端點(diǎn)安全性?
默認(rèn)情況下,所有敏感的 HTTP端點(diǎn)都是安全的,只有具有ACTUATOR 角色的用戶才能訪問(wèn)它們。安全性是使用標(biāo)準(zhǔn)的 HttpServletRequest.isUserInRole方法實(shí)施的。我們可以使用來(lái)禁用安全性。只有在執(zhí)行機(jī)構(gòu)端點(diǎn)在防火墻后訪問(wèn)時(shí),才建議禁用安全性。
如何在自定義端口上運(yùn)行 Spring Boot 應(yīng)用程序?
為了在自定義端口上運(yùn)行Spring Boot應(yīng)用程序,您可以在application.properties 中指定端口。server. port = 8090
如何實(shí)現(xiàn) Spring Boot 應(yīng)用程序的安全性?
為了實(shí)現(xiàn)Spring Boot的安全性,我們使用spring-boot-starter-security依賴項(xiàng),并且必須添加安全配置。它只需要很少的代碼。配置類(lèi)將必須擴(kuò)展WebSecurityConfigurerAdapter并覆蓋其方法。
如何集成 Spring Boot 和 ActiveMQ?
對(duì)于集成Spring Boot和ActiveMQ,我們使用依賴關(guān)系。它只需要很少的配置,并且不需要樣板代碼。
如何使用 Spring Boot 實(shí)現(xiàn)分頁(yè)和排序?
使用Spring Boot實(shí)現(xiàn)分頁(yè)非常簡(jiǎn)單。使用Spring Data-JPA可以實(shí)現(xiàn)將可分頁(yè)的傳遞給存儲(chǔ)庫(kù)方法。
什么是 Spring Profiles?
Spring Profiles 允許用戶根據(jù)配置文件 ( dev, test, prod等)來(lái)注冊(cè) bean。因此,當(dāng)應(yīng)用程序在開(kāi)發(fā)中運(yùn)行時(shí),只有某些bean可以加載,而在PRODUCTION中,某些其他 bean可以加載。假設(shè)我們的要求是Swagger文檔僅適用于QA環(huán)境,并且禁用所有其他文檔。這可以使用配置文件來(lái)完成。Spring Boot使得使用配置文件非常簡(jiǎn)單。
什么是 Spring Batch?
Spring Boot Batch 提供可重用的函數(shù),這些函數(shù)在處理大量記錄時(shí)非常重要,包括日志/跟蹤,事務(wù)管理,作業(yè)處理統(tǒng)計(jì)信息,作業(yè)重新啟動(dòng),跳過(guò)和資源管理。它還提供了更先進(jìn)的技術(shù)服務(wù)和功能,通過(guò)優(yōu)化和分區(qū)技術(shù),可以實(shí)現(xiàn)極高批量和高性能批處理作業(yè)。簡(jiǎn)單以及復(fù)雜的大批量批處理作業(yè)可以高度可擴(kuò)展的方式利用框架處理重要大量的信息。
如何使用 Spring Boot 實(shí)現(xiàn)異常處理?
Spring提供了一種使用ControllerAdvice處理異常的非常有用的方法。我們通過(guò)實(shí)現(xiàn)一個(gè)ControlerAdvice類(lèi),來(lái)處理控制器類(lèi)拋出的所有異常。
您使用了哪些 starter maven 依賴項(xiàng)?
spring-boot-starter-activemqspring-boot-starter-security什么是 CSRF 攻擊?
CSRF 代表跨站請(qǐng)求偽造。這是一種攻擊,迫使最終用戶在當(dāng)前通過(guò)身份驗(yàn)證的Web應(yīng)用程序上執(zhí)行不需要的操作。CSRF 攻擊專門(mén)針對(duì)狀態(tài)改變請(qǐng)求,而不是數(shù)據(jù)竊取,因?yàn)楣粽邿o(wú)法查看對(duì)偽造請(qǐng)求的響應(yīng)。
什么是 WebSockets?
總結(jié)
以上是生活随笔為你收集整理的SpringBoot——springboot SPI原理与实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python基础教程ppt下载_pyth
- 下一篇: Springboot配置log4j2配置