maven springboot根據環境profile設定請求地址是否允許訪問
阿新 • • 發佈:2020-12-27
1.情景展示
對於不同環境使用不同配置檔案,大家可能用的很溜,現在有個需求就是:
特定請求只對特定環境可見,比方說:請求地址是/test/*,只允許開發環境和測試環境訪問,禁止生產環境訪問。如何實現?
有人可能會想到:設定訪問密碼,此方案可行,但是如果對方知道密碼,還是能夠訪問得到;
這個問題困擾了我很久,網上也沒有現成的東西,今天想到了答案:
可以結合過濾器實現。
2.準備工作
我的多環境使用方式可能與大眾不同,所以,最好看一下。
環境切換的決定權交由pom.xml profile標籤來管理;
測試環境、生產環境等,都在pom.xml中通過新增profile標籤實現;
在這裡起第二關鍵作用的就是:environment標籤,這是我自己定義的,名稱和值可以隨便寫,只要你一會能對應上就行。
在配置檔案中引入設定自定義屬性,並引用上述標籤的值。
yml檔案引用pom.xml的屬性,使用@@,properties檔案使用${}。
3.解決方案
SpringBoot配置Filter過濾器共有兩種實現方式,這裡只介紹一種,重點不是實現方式。
建立過濾器
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.servlet.*; import java.io.IOException;
/** * 環境過濾器 * @description: 根據環境來設定可訪問的請求 * 特定請求地址只允許特定環境訪問 * @author: Marydon * @date: 2020-12-27 8:55 * @version: 1.0 * @email: [email protected] */ @Slf4j @Component public class ProfileAuthFilter implements Filter { // @Value從application-*.xml檔案獲取 // 當前執行的環境 @Value("${runtimeEnvironment}") private String RUNTIME_ENVIRONMENT; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.debug("開始環境校驗..."); if ("test".equals(this.RUNTIME_ENVIRONMENT) || RUNTIME_ENVIRONMENT.startsWith("dev")) { // 開發環境或測試環境 log.info("校驗通過,允許訪問!"); // 呼叫攔截器鏈(繼續往下走) chain.doFilter(request, response); } else { log.error("校驗失敗,禁止訪問!"); request.getRequestDispatcher("/404.do").forward(request, response); } } }
這個過濾器的關鍵點在於:
從配置檔案中取得當前執行環境的值;
開發環境和測試環境正常呼叫Controller,其它環境轉發到404請求上。
新增過濾器總配置
import com.xyh.bill.web.filter.ProfileAuthFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource;
/** * url過濾器 * @description: 對指定請求地址進行過濾,匹配上就進入對應的過濾器 * @author: Marydon * @date: 2020-12-27 8:54 * @version: 1.0 * @email: [email protected] */ @Configuration public class FilterConfig { // 注入環境認證過濾器 @Resource private ProfileAuthFilter profileFilter; /* * 把自定義過濾器包裝成Spring的一個Bean * @attention: * @date: 2020年12月27日 0027 9:20 * @param: * @return: org.springframework.boot.web.servlet.FilterRegistrationBean */ @Bean public FilterRegistrationBean registerProfileAuthFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(profileFilter); // 設定攔截路徑(只過濾以test開頭的請求) registration.addUrlPatterns("/test/*"); registration.setName("authFilter"); //值越小,Filter越靠前 registration.setOrder(1); return registration; } //如果有多個Filter,再寫一個public FilterRegistrationBean registerOtherFilter(){...}即可。 }
引入具體的過濾器,並定義該過濾器攔截的請求地址規則。
配置404請求及跳轉頁面。
4.效果展示
測試環境
響應結果:
生產環境
響應結果:
寫在最後
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!