ASP.NETフィルターの適用方法の紹介

高洛峰
リリース: 2017-01-21 15:06:32
オリジナル
1714 人が閲覧しました

J2EE Web開発にはフィルタフィルタがあり、このフィルタは指定されたURLアクセスを傍受し、実際のアプリケーションの状況に応じてフィルタメソッドを実行することができ、フィルタ内でリクエストされたコードやセッション情報を変更することもできます。つまり、このフィルタは非常に意味があり、J2EE における責任連鎖設計パターンの応用とも言えます。

それでは、ASP.NET でそのようなフィルター構造を定義し、フィルター内で対応する論理演算を実行することは可能でしょうか?答えは「はい」です。この記事では、フィルターを作成する場合に、それを IIS Web アプリケーションに構成する方法について説明します。

プロセス 1: フィルターの作成方法

フィルターの作成は実際にはフィルター クラスを作成すること、つまり HttpModule モジュールを作成することです。このフィルターは IHttpModule 基本クラスを実装し、実践的な例を提供するために Init メソッドを書き直す必要があります。は次のとおりです:

これは PageFilter.cs です

using System;
using System.Web;
using System.Web.SessionState;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
public class PageFilter: IHttpModule
{
        public String ModuleName
        {
            get { return "PageFilter"; }
        }
        //在 Init 方法中注册HttpApplication 
        // 通过委托方式注册事件
        public void Init(HttpApplication application)
        {
            application.AcquireRequestState += new EventHandler(Application_AcquireRequestState);            
        }
  private void Application_AcquireRequestState(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            HttpSessionState session = context.Session;
            HttpRequest request = context.Request;
            HttpResponse response = context.Response;
            String contextPath = request.ApplicationPath;
        }
}
ログイン後にコピー

「フィルター」は「インターセプター」とも呼ばれることに注意してください。これは、HTTP リクエスト/レスポンス全体をインターセプトするプロセスです。プロセスは多くのステージに分割できるため、フィルターがどの特定のステージをインターセプトするかという問題が発生します。たとえば、上記の Init 関数で、インターセプトする特定のステージを定義できます。リクエスト セッションを生成する段階では、AcquireRequestStat がこの状態を表し、インターセプト後の対応する処理関数は Application_AcquireRequestState であるため、Application_AcquireRequestState メソッドが以下に定義されます。このメソッドでは、アプリケーション、コンテキスト、セッション、リクエスト、および応答が実行できます。一連のオブジェクトを取得するまで待機します。これらのオブジェクトを取得した後、現在の URL アクセスが正当であるかどうかの判断、現在のアクセスがログ記録後のユーザーのアクセスであるかどうかの確認など、コアとなるビジネス ロジックを作成できます。などで


さらに、傍受のプロセス全体には多くの段階があるため、他の段階をどのように傍受するか?これは、上記と同様に、次のロジックに従って Init で定義するだけです: ステージ 1 の標準名 += new EventHandler (このステージ 1 の対応する処理メソッド名);アプリケーションの標準名 += new EventHandler (このステージ 2 に対応する処理メソッドの名前)。 。 。

フェーズの標準名は、これらのフェーズが標準名を持ち、上記の AcquireRequestState や BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、ReleaseRequestState、UpdateRequestCache、EndRequest などのアプリケーション オブジェクトの標準属性であることを意味します。 、多くのステージなど、これらのステージには特定の意味があります

このステージに対応する処理メソッドの名前は、実際にはこのステージに対応するメソッドの独自の定義であるため、これ以上の説明は行いません。 。

特別な注意が必要な点がもう 1 つあります。インターセプトできるステージは非常に多くありますが、実際のアプリケーションでは、多くの場合、インターセプトできるのは 1 つまたは 2 つのステージだけです。また、一部のサーバー オブジェクトはインターセプトできません。オブジェクトは BeginRequest フェーズには存在しませんが、AcquireRequestState 以降のフェーズには存在するため、実際のニーズに応じて特定のフェーズをインターセプトする必要があります。これは初心者にとって最も一般的な問題です。

プロセス 2: フィルタリングを設定する方法

.cs ファイルのフィルタを作成しましたが、このフィルタをどのように設定する必要がありますか? デフォルトでは絶対にインターセプトされないように設定する必要があります。アプリケーションの Web.config ファイルにサーバーを設定します。

<configuration>
<system.web>
 <httpModules>
   <add name="pageModule" type="PageFilter"/>
 </httpModules>
</system.web>
</configuration>
ログイン後にコピー

このようにして、実際に Web サイトを公開して DLL などを生成するだけです。それ以降は自動的にインターセプトされますが、デフォルトではアプリケーションのすべてのリクエストがインターセプトされることを覚えておいてください。たとえば、aspx ファイルに対するリクエストのみをインターセプトする必要があります。フィルター ロジックにファイルのサフィックスを追加します。aspx ではない場合は、そのままにしてください

ASP.NET フィルターの適用方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート