この記事では主に JavaWeb の FilterFilter の詳細な説明を紹介します。JavaWeb の Filter の使用スキルをサンプルとともに分析します。必要な方は参考にしてください。
もともとこの記事JSPを要約する予定でした。JSPには多くのコンテンツがあり、ダイエットのために夜にランニングしたいので、今日は最初にFilterとその使用例を紹介します。運動する時間。より身近なところでは、フィルタは文字通りブロックおよびフィルタリングの機能を持ち、JavaWeb のブロック ウィザードとみなすことができます。
1. オリジン
クライアントがリクエストを開始すると、サーバーはすべてのリクエストに応答できなくなります。インターセプト処理により、サーバーへの負荷が軽減されるだけでなく、データの セキュリティ も保護されます。同じことがサーバーによって行われます。共通の写真に透かしを追加するなど、クライアントに応答を送信するときにフィルタリングが必要になる場合があります。これらの問題に対処するために、フィルターが登場しました。場合によっては、リクエストとレスポンスのフィルタリングが 1 層だけではなく、複数層のフィルタリングが存在するため、フィルター チェーン (FilterChain) の概念が提案されます
2.
を使用します。それを使用する ここでそれが機能します。フィルターは、リクエストが サーブレット に到達する前、および応答がブラウザーに到達する前に、フィルター チェーンを順番に通過します。 asp.net の httpmodule に似ています。Filter を使用すると、主に javax.servlet.filter インターフェース が実装されます。 APIを見ると、3つのメソッドがあることがわかります。
1.public void init(FilterConfig filterConfig) throws ServletException
サービスに組み込まれるフィルターを示すために Web コンテナーによって呼び出されます。サーブレット コンテナは、フィルタをインスタンス化した後、init メソッドを 1 回だけ呼び出します。フィルタにフィルタリング作業を依頼する前に、init メソッドが正常に完了する必要があります。 init メソッドが ServletException をスローするか、Web コンテナによって定義された期間内に返らない場合、Web コンテナはフィルタをサービスに追加できません。これはサーブレットのライフサイクルに似ています。初期化は 1 回だけ行われ、destroy() も 1 回実行されます。
2.public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws java.io.IOException, ServletException
クライアントのリソース要求によりリクエスト/レスポンスがチェーンを通過するたびに、チェーンの終わり 時間になると、コンテナは Filter の doFilter メソッドを呼び出します。このメソッドに渡される FilterChain により、フィルターはチェーン内の次のエンティティにリクエストとレスポンスを渡すことができます。
このメソッドの一般的な実装は、次のパターンに従います。
1. リクエストを検査します
2. オプションで、リクエスト オブジェクト をカスタム実装で入力フィルタリングのフィルターコンテンツまたはヘッダーにラップします
3.カスタム実装を含む応答オブジェクトを出力フィルタリング用のフィルター コンテンツまたはヘッダーにラップします
4. a) FilterChain オブジェクト (chain.doFilter()) を使用して、フィルター チェーン内の次のエンティティを呼び出します
4.フィルター チェーンの次のエンティティを呼び出す前に、リクエスト/レスポンスのペアをフィルター チェーンの次のエンティティに渡さないことで、リクエストの処理をブロックすることもできます。エンティティは、応答にヘッダーを直接設定します。
3.public void destroy()
サービスから取り出されるフィルタを示すために Web コンテナによって呼び出されます。このメソッドは、フィルターの doFilter メソッド内のすべてのスレッドが終了
した後、またはタイムアウト期間が経過した後に、1 回だけ呼び出されます。このメソッドを呼び出した後、Web コンテナはこのフィルター インスタンスの doFilter メソッドを呼び出しません。このメソッドは、フィルタが保持しているすべてのリソース (メモリ、ファイル ハンドル、スレッドなど) をクリアする機会を提供し、永続的な状態 がメモリ内のフィルタの現在の状態と確実に同期されるようにします。
3. ケースフィルターを使用する場所はたくさんあるので、ここでは 1 つずつ例を示しません。次のデモは、前のブログの HelloWorld プロジェクトに基づいて、リーチ防止機能を実装します。フィルター使用の機能を体験していただきます。
1.準備HelloWolrd プロジェクトにフォルダーを追加し、そのフォルダーに 2 つの写真、1 つは err.png 、もう 1 つは test.png を置きます。2 つの写真は次のとおりです
2. フィルターを作成します 新しいフィルターはありませんここでは、フィルター パッケージ、前のブログの com.test.cyw パッケージ内に直接フィルター ファイル MyFilter を作成します。これは、Filter クラスを管理するためだけにパッケージを作成する必要があります。作成後、MyFilterFilterが継承されていることがわかります。
public class MyFilter implements Filter
package com.test.cyw; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.*; /*@WebFilter("/MyFilter")*/ public class MyFilter implements Filter { public MyFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; String referer=req.getHeader("referer");//链接来源地址 if(referer==null||!referer.contains(req.getServerName())) { req.getRequestDispatcher("/Images/err.png").forward(req, res); return; } chain.doFilter(req, res); } public void init(FilterConfig fConfig) throws ServletException { } }
上記は、Filter インターフェイスを実装するためのクラスを作成したところです。 Web.
xmlで設定する必要があります。これはサーブレットの構成と少し似ています。
<filter> <filter-name>MyFilter</filter-name> <filter-class>com.test.cyw.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/Images/*</url-pattern> </filter-mapping>
test.jspファイルを新規作成し、jsp内にimgを表示します
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <img alt="防盗链" src="Images/test.png" width="400"> </body> </html>
test.pngのアドレスを直接入力すると正常に表示されます。ブラウザでは err.png が表示されます
4. 発生した問題最初は、アドレスエラーのため、Google Chrome test.jsp で表示された画像も err.png 画像でした。と思ったのですが、切り替えてみたところページを更新しても変化がなく、とても困惑しています。 Tomcaを再起動してもダメな場合があり、何度か試してみましたが、どうしてもダメなときはIEで試してみましたが、予想外にGoogle Chromeで表示されていました。 キャッシュ
があるため、表示が正しく行われませんでした。 5. まとめフィルターには多くの用途があり、インターネット上に多くの例があります。プロジェクトを実行するときは、最初にウォーターマークなどの一般的なものを実装するだけで済みます。 xmlで解決するととても便利です。
以上がJavaWeb のフィルターの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。