springboot-sample
介紹
軟體架構(當前發行版使用)
- springboot
- hutool-all 非常好的常用java工具庫 官網 maven
- bcprov-jdk18on 一些加密演算法的實現 官網 maven
- h2 純java的資料庫,支援記憶體、檔案、網路資料庫 官網 maven
安裝教程
git clone --branch 6.使用加密資料來源並配置日誌 git@gitee.com:simen_net/springboot-sample.git
功能說明
- 配置logback
- 配置了資料來源,對資料庫賬號密碼進行加密
- 增加了系統啟動配置
發行版說明
- 完成基本WEB服務 跳轉到發行版
- 完成了KEY初始化功能和全域性錯誤處理 跳轉到發行版
- 完成了基本登入驗證 跳轉到發行版
- 完成了自定義加密進行登入驗證 跳轉到發行版
- 完成了使用JWT進行授權認證 跳轉到發行版
- 完成了使用加密資料來源並配置日誌 跳轉到發行版 檢視發行版說明
使用加密資料來源並配置日誌
配置logback
配置logback.xml,規範日誌輸出格式,配置info和error日誌輸出為檔案(儲存30天)
配置資料來源
-
在application-dev.yaml中配置資料來源
# spring基本配置 spring: # 資料庫連線池配置 datasource: driver-class-name: org.h2.Driver # 使用H2資料庫,此處不配置url,在com.strong.config.DataSourceConfig中配置本地目錄資料庫 # url: jdbc:h2:mem:simen # url: jdbc:h2:./simen username: BKkV4rITSiMsMBEZtIoNeLivkfJYjRNPJjX0EJ21hxMQ/oflQL5Qk3u8B7RhqfD+KIkOkPHDSNx3c67q78lTwLqTOCuYkltDI2R9kES3d4yXb+bFxtXAm9qs7m+EMLX85MRX password: BDNZEUz2C0XDhU0y3OtKUCVkoLKVlTo5EXEIhBtKHwAGT5heBYyKkkd0I5J8A1PBRGkczhA86MqI2SQTXXuJ+b+ki4jqhlNhELG+ts6T/VZugd6pKs5bbqcSDWqT5s0XEpbgJ1Ah7aE56AbazjVaBX5U3FsEU/KhWHQ3qx0KoN47 # 連線池型別 type: com.alibaba.druid.pool.DruidDataSource # 引數配置 druid: # 初始化時建立物理連線的個數 initialSize: 5 # 最小連線池數量 minIdle: 20 # 最大連線池數量 maxActive: 50 # 獲取連線時最大等待時間,單位:毫秒 maxWait: 60000 # 是否快取PSCache,PSCache對支援遊標的資料庫效能提升巨大 poolPreparedStatements: true # 啟用PSCache,必須配置大於0 maxPoolPreparedStatementPerConnectionSize: 20 # 用來檢測連線是否有效的sql validationQuery: select 1 # 檢測連線是否有效的超時時間,單位:秒 validationQueryTimeout: 5 # 申請連線時執行validationQuery檢測連線是否有效,會降低效能 testOnBorrow: false # 歸還連線時執行validationQuery檢測連線是否有效,會降低效能 testOnReturn: false # 申請連線的時候檢測連線是否有效 testWhileIdle: true # 空閒時間超過minEvictableIdleTimeMillis,是否強制keepAlive keepAlive: false # 空閒時間大於等於minEvictableIdleTimeMillis則關閉物理連線,單位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 連線保持空閒而不被驅逐的最小時間,單位毫秒 minEvictableIdleTimeMillis: 30000 # 物理連線初始化的時候執行的sql。 connectionInitSqls: select 0 # 常用的外掛有:監控統計用的filter:stat、日誌用的filter:log4j、防禦sql注入的filter:wall filters: stat,wall,slf4j # 透過connectProperties屬性來開啟mergeSql功能;慢SQL記錄 connectionProperties: |- druid.stat.mergeSql=false; druid.stat.slowSqlMillis=5000
-
增加資料庫配置DataSourceConfig,對賬號密碼進行加密,解決專案原始碼提交到公共git造成賬號密碼洩露的問題。
/** * 從預設引數配置資料來源 * * @return {@link DataSource} */ @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource getDataSource() { DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build(); // 如果是H2資料庫,則注入載入 if (StrUtil.equals(org.h2.Driver.class.getName(), driverClassName)) { // 配置資料庫URL String strJdbcUrl = "jdbc:h2:tcp://localhost:9092/" + StrongUtils.getStaticPath(STR_DIRECTORY_STATICS, databaseName); druidDataSource.setUrl(strJdbcUrl); log.info("成功連線H2資料庫[{}]", strJdbcUrl); } // 使用私鑰解密賬號密碼,注入資料來源 druidDataSource.setUsername(SM2_OBJ.decryptStr(username, KeyType.PrivateKey)); druidDataSource.setPassword(SM2_OBJ.decryptStr(password, KeyType.PrivateKey)); return druidDataSource; }
- 使用DruidDataSource從application-dev.yaml中載入資料來源配置引數
DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();
- 在使用H2資料庫時,使用專案名為資料庫名,資料庫檔案儲存在當前專案所在目錄中的
static
中 - 從application-dev.yaml中讀取加密後的資料庫賬號密碼,使用私鑰解密後注入資料來源
- 使用DruidDataSource從application-dev.yaml中載入資料來源配置引數
系統啟動配置
- 在SpringbootSampleApplication.java中配置啟動
public static void main(String[] args) { // 測試加解密、簽名字串 SecurityUtils.testPasswordEncode(); // 生成資料密碼加密後字串 String strDatabaseUsername = "sa"; String strDatabasePassword = "123456"; log.info("\n使用公鑰加密資料庫賬號密碼,需將加密字串配置到application.yaml\n資料庫使用者名稱[{}] 加密後[{}]\n密碼[{}] 加密後[{}]\n", strDatabaseUsername, SM2_OBJ.encryptBase64(strDatabaseUsername, KeyType.PublicKey), strDatabasePassword, SM2_OBJ.encryptBase64(strDatabasePassword, KeyType.PublicKey) ); // 啟動H2伺服器 H2Utils.startH2Server(); // 設定當前時區 TimeZone.setDefault(TimeZone.getTimeZone(STR_TIME_ZONE_ASIA_SHANGHAI)); // 獲取系統物件 SpringApplication application = new SpringApplication(SpringbootSampleApplication.class); // 系統pid記錄檔案 String strPidFile = StrongUtils.getStaticPath(STR_FILE_APP_PID); // 將pid監聽資訊寫入記錄檔案,使用 cat /xxxx/app.id | xargs kill 停止服務 application.addListeners(new ApplicationPidFileWriter(strPidFile)); log.info("將pid監聽資訊寫入記錄檔案{}", strPidFile); // 啟動系統 application.run(); }