1. 程式人生 > 實用技巧 >maven springboot根據環境profile設定請求地址是否允許訪問

maven springboot根據環境profile設定請求地址是否允許訪問

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.效果展示

  測試環境

  響應結果:

  生產環境

  響應結果:

寫在最後

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

相關推薦: