背景
Yipay (個人ビザなし決済プラットフォーム) に取り組んでいたとき、インターフェイス ログの印刷、クロスドメイン処理、ログイン認証などの機能を実行するためにフィルターを使用していましたが、最近ログ ファイルを確認したところ、突然、次のような情報が含まれていることに気づきました。ログに出力されるのはペアでした ペアで、その時点で何かが間違っていることに気づきました インターフェイスが繰り返しリクエストしていましたか?
しかし、注意深く再現した結果、インターフェイスが繰り返しリクエストを行ったのではなく、フィルターが繰り返し実行され、結果としてログが繰り返し出力されることが判明しました。
トラブルシューティング
インターフェイスの問題ではないのに、なぜフィルターが 2 回実行されるのでしょうか?
問題のコードは次のとおりです。
SpringBoot スタートアップ クラス
@ServletComponentScan("com.walter.filter")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
フィルター
@Component
@WebFilter
@Order(1)
public class ControllerFilter implements Filter {
// 业务逻辑
}
@ServletCompnentScan
スタートアップ クラスにアノテーションを追加したため、フィルターはこのアノテーションによってスキャンされるパッケージの下にあり、フィルターに 2 つのアノテーションを同時に追加したため @Component
、 @WebFilter
Spring コンテナーの起動時にフィルターが失敗することがわかりました 。 2回ロードされました。
解決
プラン1
フィルターの @Component
注釈を削除する
シナリオ 2
@ServletComponentScan
スタートアップクラスのアノテーションを削除する