プログラマーは、あなたが合理的な選択フィルター、インターセプター、アスペクトではないでしょうか?

旧区:科学教室の著者を楽しむために招待

してください状態のソースを再現!

序文

リトル友人が聞いたことがあるはずですフィルタは、インターセプタは、カットは、すべてのインプレッションが切り捨て傍受の役割を果たすことができるいくつかのビジネスニーズをやって、私たちが選択する方法がわからない、昔の今日のケアは、それらの違いを紹介します。

フィルターフィルター

フィルタはできる要求と応答プロセスインターセプト(のServletRequest要求、ServletResponseを応答)、および要求応答フィルタリング動作を行うために。

フィルタは、サーブレットコンテナに依存します実装に、コールバック関数が基づいている、それは、実質的に全てとフィルタ・インスタンスをフィルタリングすることができるだけができるコンテナを初期化するために一度呼び出されます。

フィルタの目的をするために使用されるいくつかのフィルタリングを行う、私たちのような、取得したいデータを取得するには:フィルタの文字エンコーディングを変更し、いくつかのパラメータのHttpServletRequestフィルタの変更は、前記フィルタ下品な言葉、危険な文字などを。いくつかの単語の男は、コードの前に言いました。

再定義2コントローラ、UserControllerで、OrderController

がフィルターとフィルターコントローラの要求が定義されていますが、フィルターは非アクティブです。フィルタは、2つのオプションがあり、外観を設定する必要が@Componentとフィルタートップの最初のオプションは

@Component
public  class  TimeFilter  implements  Filter
复制代码

コンフィギュレーション・レジスタ・フィルタの第2の実施形態

プログラムの第2の特徴は、あなたができることであるにどのようなURLフィルタリングルールを絞り込むたちフィルタが初期化されると、init関数がコールバックされ、アプリケーションを起動したとき

リクエストのhttp:// localhostを:9000 /オーダー / 1

ログ出力コンソールを見てください

リクエストのhttp:// localhostを:9000 /ユーザー / 1

コンソールのログ出力

アプリケーションを停止した後、コンソール出力

Webアプリケーションの起動を持つフィルタが開始された Webアプリケーションで、一度だけ、初期化と破壊を止めます。

実施例1のフィルタロードサーバを起動し、init()メソッドを呼び出しインスタンスを初期化します。

各要求2である呼処理のための方法のみのdoFilter()

3.サーバーが停止し破棄()メソッドを呼び出してインスタンスを破棄し、。

私たちはdoFilterメソッドを見てみましょう

doFilter(のServletRequest要求たServletResponse応答れるFilterChain鎖)

我々は、取得することができるパラメータは、フィルタからの参照データパラメータ及び要求に対する応答を、このメソッドは、メソッドが実行されるものコントローラクラスを知ることができません。注意すべき別の点は、つまり、使用しないで、フィルタが注入Beanを使用することができない、ということである@Autowired

上記コードインジェクションはヌルです。これはなぜですか

実際には、春には、Webアプリケーションの順序が起動されます。listener->フィルタ- >サーブレット最初のリスナーを初期化し、その後、フィルタの初期化時に戻ってきて、その後、その後、唯一の私たちのdispathServletを初期化するために、私たちは、フィルターを注入する必要がある場合注記Beanは、失敗注入する際にフィルタの初期化、豆の初期化を注釈付きではないので、注入されません。

あなたが使用したい確信している場合は、何らかの処理を行う必要があり、プライベートの手紙ああ古い区をすることができます

インターセプタインターセプタ

フレームウェブに依存し、それはSpringMVC SpringMVCでフレームに依存しています。実装上、Javaリフレクション・メカニズムに基づいて、アスペクト指向プログラミング(AOP)を使用している属し、それは前者の方法、メソッド呼び出し、又は方法を法と呼ばれた後で、です。

WebMvcConfigurationSupportで外観を構成します

結果

私たちは、インターセプタは、コントローラオブジェクトを取得することができますことを発見しました

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
复制代码

オブジェクト・ハンドラは、オブジェクトの制御方法であって

HandlerMethod handlerMethod = (HandlerMethod)handler;

handlerMethod.getBean().getClass().getName(); //获取类名

handlerMethod.getMethod().getName(); //获取方法名
复制代码

しかし、我々は、パラメータ値を得る方法よりも少ない、これが理由であることがわかりましたか?DispatcherServletクラス、メソッドdoDispatch(HttpServletRequestのリクエスト、HttpServletResponseの応答) 。

applyPreHandleこの方法の実装は、インターセプタの実行のpreHandler方法であるが、この処理は、制御方法は、要求パラメータ、要求からアセンブリパラメータの方法を取得しない。しかし、パラメータが組み立てられるときに、この方法をha.handle

メソッドのパラメータを取得していますが、IOC Beanを取得することができないがああ。

そしてことを指摘postHandler方法

内部制御装置が異常であるPostHandler実行方法、PostHandler方法が実行されません。

afterCompletion方法この方法は、このパラメータを例外EXを有し;かかわらず、異常な内部コントローラは、この方法を実行するがあるかどうかの、異常がある場合、exは外れ値となり、これは異常なnullでありません

内部制御装置が異常であるが、異常な例外が統一捕捉@ControllerAdviceある場合の注意事項は、その後、元はnullになります

アスペクトスライス

AOPインターセプト横の操作は、操作を行うことができ、最大の利点は、彼ができることである方法を行うためのパラメータを取得し、統一されたプロセスの方法を。一般的な使用ログ、トランザクション、セキュリティ認証リクエストパラメータようにと。

上記のコードは、我々は、メソッドのパラメータを取得することができます

セクションのAOPは、メソッドのパラメータを得ることができますが、応答を取得することはできませんが、オブジェクトを要求します。

概要

ここでは、違いを見て、フィルター、インターセプター、アスペクトをまとめます

すべての3つが同時に採用した場合、そのことを実行の順序とは何ですか、それは?

フィルタ - >インターセプター - > ControllerAdvice - >アスペクト - >コントローラ

戻り値のため、または例外からの復帰の順序

コントローラ - >アスペクト - > controllerAdvice - >インターセプタ - >フィルタ

図は、実行の使用順序を記述します

中小彼らのビジネスに応じてパートナー、および上記の技術のそれぞれの特性は、適切な技術を選択します。今日では、古い区はここで紹介、ありがとうございました!

あなたの賞賛と注目は、私は勢いを作成し続けるものです

おすすめ

転載: juejin.im/post/5d64f867f265da03cf7a9d15