實作 IHttpModule 與 IRequiresSessionState,在 AcquireRequestState 事件攔截請求,檢查 Session 是否存在,未登入導向預設頁。
using System;
using System.Web;
using System.Web.SessionState;
namespace QTJZ
{
public class Filters : IHttpModule, IRequiresSessionState
{
public void Dispose() { }
public void Init(HttpApplication application)
{
// 註冊 AcquireRequestState 事件:Session 狀態可用之後
application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
}
public void application_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
HttpRequest request = app.Request;
HttpResponse response = app.Response;
string url = request.CurrentExecutionFilePath.Trim('/');
string suffix = request.CurrentExecutionFilePathExtension.Trim('.');
// 過濾規則:非 Default.htm 且為 .aspx 或 .htm 則檢查 Session
if (!url.Equals("Default.htm") && (suffix == "aspx" || suffix == "htm"))
{
object sessionObj = app.Context.Session == null ? null : app.Session["UserID"];
if (sessionObj == null)
{
response.Redirect("~/Default.htm");
}
}
}
}
}
| 事件 | 觸發時機 | 適用場景 |
|---|---|---|
| BeginRequest | 管線開始,最早 | URL 重寫、請求記錄、防火牆 |
| AuthenticateRequest | 身分識別建立後 | 自訂驗證邏輯 |
| AuthorizeRequest | 授權驗證後 | 角色權限檢查 |
| AcquireRequestState | 取得 Session 狀態後 | 需存取 Session 的邏輯(本例) |
| PreRequestHandlerExecute | 處理器執行前 | 頁面級初始化 |
| PostRequestHandlerExecute | 處理器執行後 | 輸出過濾、壓縮 |
| ReleaseRequestState | 儲存 Session 狀態前 | Session 清理 |
| EndRequest | 管線結束,最後 | 回應記錄、清理資源 |
在 AcquireRequestState 事件中存取 app.Session 若未實作 IRequiresSessionState,會拋出「工作階段狀態在此內容中無法使用」例外。此介面標記模組需要 Session 支援,ASP.NET 會確保 Session 模組已初始化。
<configuration>
<system.web>
<httpModules>
<add name="filters" type="QTJZ.Filters" />
</httpModules>
</system.web>
<!-- IIS 7+ 整合管線模式需同時註冊於 system.webServer -->
<system.webServer>
<modules>
<add name="filters" type="QTJZ.Filters" preCondition="managedHandler" />
</modules>
</system.webServer>
</configuration>
app.Use(async (context, next) => { ... }) 取代 HttpModule本範例展示傳統 ASP.NET WebForms/HttpModule 架構。新專案請採用 ASP.NET Core Middleware 或成熟身分識別框架。