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