コールチェーンシリーズ(3):どのようにスクラッチ本文とヘッダーをキャプチャします

参考資料:コールチェーンシリーズ(1):蛇UAVStackの解釈

コールチェーンシリーズ(2):達成するために、ライトコールチェーン

Javaでは、HTTPプロトコル要求/応答モデルは、サーブレット仕様+(Tomcatなど)サーブレットコンテナ実装です。つまり、Tomcatコンテナクラスでは、完全なHTTPリクエストはサーブレット仕様を実装することによって完成され、春、Jeseryテクノロジ・スタックは、パッケージのサーブレット仕様のベースです。だから我々は、すなわち、カスタムのHttpServletクラスには、利用者の身体を傍受することによってのHttpServletRequestやHttpServletResponseのを実装し、HTTPヘッダを取得し、ボディとHTTPヘッダーを取得するには、Javaテクノロジー・スタックの基礎となるServlet仕様を利用することができます。

あなたが知っている記事を読む前に、UAVStackミドルウェアフレームワークの強化技術を頼っているチェーン・モデルとアーキテクチャを呼び出します。この記事では、私は特定の本文とヘッダーをキャプチャするためにゼロから開始する方法をご紹介します。

まず、インターセプトhttpリクエスト

要求の本文とヘッダから、できるだけ多くのコードに小さな変更の前提を抽出したい、そうでない場合は、すべてのHttpServletの実装クラスにコードを埋め込む必要がある、容器の中に要求を傍受するために統一されなければなりません。ここでは、フィルタ機構サーブレット仕様の作家が再び私たちを提供しています感謝しなければなりません。

サーブレット仕様では、フィルタは、再利用可能なコード・セグメントは、コンテンツのHTTP要求、応答、およびヘッダ情報を変換することができるです。フィルタは、一般的に要求に対する応答を作成しませんが、リクエストとレスポンスを変更したり、適応します。メインフィルタは、傍受する4つの方法が用意されています。

  • REQUEST:実行フィルタは、直接ターゲットリソースにアクセスします。含む:アドレスバーに直接アクセス、フォームの送信、ハイパーリンク、あなたがいる限り、アドレスバーなどのターゲットリソースのパスを見ることができますリダイレクト、要求があります。
  • FORWARD:フィルタを実行するためのアクセスを転送。()メソッドフォワードするRequestDispatcher#を含む、<JSP:フォワード>タグはアクセスに転送されます。
  • INCLUDE:フィルタを実行するためのアクセスが含まれています。備えするRequestDispatcher#()メソッドが含まれ、<JSP:含める>タグは、包括的アクセスです。
  • ERROR:web.xmlの<エラーページ>のためのリソースのターゲットの割り当ては、本当に例外が発生した場合には、ターゲット・リソースに転送する場合、フィルタを実行します。

ここでは、ちょうどREQUESTモードを使用します。コンフィギュレーション・フィルタの後、我々はアップ(以下、要求と応答とも呼ばれる)のHttpServletRequestとHttpServletResponseの中のdoFilterフィルタ方法から得ることができます。

第二に、ヘッダを取得します

私たちは、フィルタ機構を介して上記のリクエストとレスポンスを取得しています。私たちは、対応するソースコードの実装は、次のAPIで見つけることができます開きます。

API仕様は、我々が簡単にヘッダー内のリクエストとレスポンスを得ることができます組み合わせgetHeaderNames()とのgetHeader(String name)メソッドを使用して、直接アクセスヘッダー私たちに提供されています。

身体への第三に、アクセス

体を得るために多くの同じ要求と応答の方法。ここでは、最初の要求、例えば、後の適応は異なるだろう。

APIのリクエストから見つけることができる、Javaでボディサーブレット入力が保存され、サーブレット入力はInputStreamを継承しています。直接読み込む場合は、ユーザーが身体を取得(のInputStreamは、ポインタのみの領収書がない限り、一度読むことができるため)空になります。ここでは、サーブレットのラッパー機構の助けを必要としています。

四、ラッパーでサーブレット

ここでは簡単にrequestWrapperとresponseWrapper。すべての操作要求と応答行動が私たちの自己を通過するように、ラッパーは継承によって達成するServlet仕様で装飾模様にHttpServletResponseWrapperとHttpServletRequestWrapperクラスは、Javaプロキシと類似の要求と応答のための筐体に相当しています体内で定義されたラッパー、繰り返し取得要求と応答が可能です。

第五に、独自のラッパーを書きます

私たちは、例えば、カスタムラッパーを記述する方法を説明し、要求します。オープンソースのサーブレットAPI可視HttpServletRequestWrapperクラスはServletRequestWrapperクラスを継承したHttpServletRequestインタフェースを実装します。

ServletRequestWrapperクラスは道のほとんどを達成するために私たちを支援してきました。

getInputStream getReaderなど:いくつかの方法は、我々だけのような、気にする必要は上書きすることができます。

ユーザーがgetReaderまたはのgetInputStreamを呼び出すしようとすると、私たちは自身のストリームのためにそれを交換し、追加のgetContent()メソッドを提供します、身体のコンテンツ抽出でバイトを[]のStringBuilderまたはから先読み。

ラッパーの定義を書いたので、私たちは、フィルタ上で定義されたに入れ、およびパッケージングに元の要求を置き換えるため、ユーザの要求は、私たちのrequestWrapperになってきたことができます。

第六に、抽出ロジックを最適化します

この方法は、先読みを含む上記のinputStream本体が実行さに相当し、ユーザはバイト[]のgetInputStreamを呼び出すかのStringBuilderはInputStreamを格納するために変換され、中間バイト[]またはStringBuilderのがユーザに返さ。ユーザーは、このHTTPリクエストボディを気にしない場合は、ユーザーがリクエストのボディを使用していない、つまり、我々は、事前に(貴重なCPU時間とメモリリソースを無駄に)有用な作業を行うことのそれと同等を読み出します。どのようにユーザーがInputStreamの使用を読み取った場合にのみ、ユーザーや体を得るために、複数の論理フォローアップは、我々の目標を最適化するために、一度だけ読まれたときにことを保証するために。

答えは、ソースコードを探すために継続することです。我々のデータのInputStreamの以来、私たちは、ソースコードをフォローアップしてまで読むことのInputStream方法を見ることができます。サーブレット仕様で値、INPUTSTREAMはサーブレット入力に包装だけでなく、サーブレット入力ReadLineメソッドが提供されます。注意深い観察では、次のチャートでreadメソッドのInputStreamを呼び出している、見つけることができます:

readメソッドは、統一された入り口であるだけなので、それらを読んで、上書きサーブレット入力カスタムを実装する必要がある場合は、()メソッドは、それを読むためにすべての方法を変更することができるのだろうか?答えはイエスです。InputStreamのユーザーに読んだときに限り、ユーザはreadメソッドを呼び出したときに、密かに私たちに関心の内容をコピーしたとして、我々はそれだけで身体を確保することができます。

次の質問は、ユーザーが何度も読んで呼び出したときにInputStreamのは一度だけ読んで確保する方法です。それはAtomicBooleanマークを助ける必要があります:あなたがtrueに設定されている完全な読み取りを、持っていた場合には、それ以外の場合はfalse。次のように最終的な結果は以下のとおりです。

最優先七、

ここでは、体内のコンテナ(Tomcatの)に私たちを取得し、すべてのHTTPリクエストヘッダするサーブレット仕様フィルタとラッパーメカニズムを使用しています。特定の機密データの伝送、クライアント側の暗号化、復号化およびサーバ側で統一し、フォーマットされ、クライアント側データ・フォーマットによって送信された:容量はさらになど、実際の生産に拡大することができます。

この記事を読んだ後、あなたはヘッダとボディが簡単なコードでコンテナにすべてのHTTPリクエストを取得し、元のコードに影響を与えずにできるはずです。しかし、特殊な技術スタック、適応のためにも必要性のため。プロジェクトはジャージーで使用され、そのようなアプリケーション/ x-www-form-urlencodedでフォームなどのパラメータを使用して、情報の送信が、サーバがパラメータを取得するために注釈を@FormParam使用していない場合は、本体ユーザを得た後パラメータを取得することはできません。しかし、少なくとも、私たちは、このパスが可能であり、それは半分に成功していることを確認しました。私たちは、この技術は、誰もが仕事で共有するために役立つことを願って。

オープンソース・アドレスします。https://github.com/uavorg/uavstack

著者:李チョン

出典:テクノロジーのCreditEase研究所

おすすめ

転載: www.cnblogs.com/yixinjishu/p/11356614.html