SpringBoot-3 攔截器注入配置

如果攔截器加載的時間點在Spring的上下文初始化之前,導致注入的值爲null,您可以嘗試以下兩種解決方法:

  1. 使用@PostConstruct註解:
    在攔截器中使用@PostConstruct註解標記一個初始化方法,在該方法中手動獲取配置值,並進行相應的處理。這樣可以確保在攔截器初始化完成後,配置值已經被正確加載。例如:
@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Value("${authorize.token}")
    private String expectedToken;

    private String cachedExpectedToken;

    @PostConstruct
    public void init() {
        // 在初始化方法中獲取配置值並緩存
        cachedExpectedToken = expectedToken;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 使用緩存的配置值進行處理
        String token = request.getHeader("Authorization");
        System.out.println("從header中獲取到token:" + token);
        System.out.println("expectedToken:" + cachedExpectedToken);
        if (token != null && token.equals(cachedExpectedToken)) {
            return true;
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("無權限訪問");
            return false;
        }
    }

    // 省略其他方法
}
  1. 自定義屬性讀取類:
    創建一個自定義的屬性讀取類,在該類中手動讀取配置文件中的屬性值,並在攔截器中使用該屬性讀取類獲取配置值。這樣可以確保配置值在攔截器初始化之前已經被正確加載。例如:
@Component
public class TokenProperties {

    @Value("${authorize.token}")
    private String expectedToken;

    public String getExpectedToken() {
        return expectedToken;
    }
}

@Component
public class TokenInterceptor implements HandlerInterceptor {

    private final TokenProperties tokenProperties;

    @Autowired
    public TokenInterceptor(TokenProperties tokenProperties) {
        this.tokenProperties = tokenProperties;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 使用屬性讀取類獲取配置值進行處理
        String token = request.getHeader("Authorization");
        System.out.println("從header中獲取到token:" + token);
        System.out.println("expectedToken:" + tokenProperties.getExpectedToken());
        if (token != null && token.equals(tokenProperties.getExpectedToken())) {
            return true;
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("無權限訪問");
            return false;
        }
    }

    // 省略其他方法
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章