第一個SpringBoot插件-捕獲請求並且支援重新發起
SpringBoot 插件入門
簡介
- 公司用的是SpringBoot,api框架用的是swagger-ui,確實用的不錯,但是在使用過程中發現一個問題,就是當前端正式調用的時候,如果參數一多的話模擬請求比較麻煩,或者swagger-ui無法模擬出前端的完整請求參數,比如參數放到header裡面的,就萌生了一個想法,可以不可以自己寫一個類似swagger-ui的插件,通過捕捉訪問進來的請求,將其header和param保存下來,下次如果出現問題的話可以通過相同的header和param來再次進行請求.
思考過程
- 即通過filter捕獲指定路徑內的請求,然後將其params和headers存放到一個map中,暫時還沒有保存資料庫,最大容量為100,提供了一個簡單的前端頁面來進行內容的頁面化,頁面上可以選擇直接用相同的參數發起請求,同時還支援更改其中的參數來發起請求,請求是通過前台頁面直接發起.
- 這個邏輯其實蠻簡單的,難點在於如何將一個springboot打成jar包供其他項目引用,如何把頁面集成到springBoot中,是否需要進行其他的配置,如何將其他包內的Bean引入到主項目中.
- 最後還是去參考了一下swagger-ui的源碼,Swagger-UI源碼
開發過程
- 首先編寫基本的程式碼,即Filter,數據的保存類,以及對應的前台UI,編寫UI的時候有一個難點,就是如何獲取到當前項目的地址,最後用下面的程式碼解決:
var urlMatches = /(.*)/reqCatch.html.*/.exec(window.kk); this.baseUrl = urlMatches[1] + '/';
- 編寫完成基本程式碼以後要考慮如何將其打成jar包給其他工程直接調用,因為用的是SpringBoot的工程,所以說需要將打包的插件更改為maven的打包插件,如下,然後運行maven install命令就可以將其打成一個可以被別的項目引入的jar.
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins>
- 打成jar以後首先要看一下前端頁面是否可以訪問到,靜態資源html等發到static下面,打成jar以後還是直接可以通過原先的網址訪問的,不會衝突,到這一步則可以引入jar,可以訪問到前台頁面,只需要將其Bean添加到主項目中,然後編寫一下指定的配置類即可.
- 如何將bean引入到主項目的Spring環境中,此處是借鑒Swagger-UI的用法,首先編寫一個註解,並且運用Import引入一個配置類,然後在配置類上通過@ComponentScan((basePackages= {"com.xx","com.xx"})),直接在主類的配置文件編寫這個註解就可以引入對應的Spring環境中
// 註解類 @Retention(RetentionPolicy.RUNTIME) @Target({java.lang.annotation.ElementType.TYPE}) @Documented @Import({CatchReqConfiguration.class}) // 將這個類交給Spring管理 public @interface CatchReq { } // 配置類 @Configuration @ComponentScan(basePackages= {"com.req.controller","com.req.filter"}) // 掃描包 public class CatchReqConfiguration { }
- 這樣就可以將jar包內指定路徑的Bean交給Spring管理.
- 下一步就是編寫改插件的配置文件,通俗點就是註冊一個Filter,將下面的配置方法放到主項目中,即可以開啟插件效果,到此,一個非常簡單的Spring Boot的插件就算開發完成.
@Configuration @CatchReq public class CatchFilterDemo { @Bean @SuppressWarnings({ "rawtypes", "unchecked" }) public FilterRegistrationBean timerFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new CatrhReqFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }
發布該jar到私有庫
<distributionManagement> <!--正式版本 --> <repository> <!-- nexus伺服器中用戶名:在settings.xml中<server>的id --> <id>nexus-releases</id> <!-- 這個名稱自己定義 --> <name>Release repository</name> <url>http://192.168.1.241:8088/repository/maven-releases/</url> </repository> <!--快照 --> <snapshotRepository> <id>nexus-snapshots</id> <name>Snapshots repository</name> <url>http://192.168.1.241:8088/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
介面演示
程式碼