我有一个包含大量页面的网络应用程序,其中大部分都需要一些 session 变量才能运行。
我想在我的应用中加入一些防御性代码。放东西的最佳位置在哪里:
if (Session.Count == 0){
Response.Redirect("~/default.aspx");
}
编辑:如何检查当前页面是否为 defult.aspx?
最佳答案
挺难的,幸好解决了。
您需要在 Global.asax 中实现 Application_PreRequestHandlerExecute
这是代码
/// <summary>
/// The event occurs just after Initialization of Session, and before Page_Init event
/// </summary>
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
// here it checks if session is reuired, as
// .aspx requires session, and session should be available there
// .jpg, or .css doesn't require session so session will be null
// as .jpg, or .css are also http request in any case
// even if you implemented URL Rewritter, or custom IHttp Module
if (Context.Handler is IRequiresSessionState
|| Context.Handler is IReadOnlySessionState)
{
// here is your actual code
// check if session is new one
// or any of your logic
if (Session.IsNewSession
|| Session.Count < 1)
{
// for instance your login page is default.aspx
// it should not be redirected if,
// if the request is for login page (i.e. default.aspx)
if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/default.aspx"))
{
// redirect to your login page
Context.Response.Redirect("~/default.aspx");
}
}
}
}
编辑 1:解释和结论
正如其中一个人所说 ASP.NET Application Life Cycle .
有很多事件发生。
实际上 Global.asax 中的事件按以下顺序引发
- 验证请求//看起来只是内部机制
执行 URL 映射//看起来只是内部机制
引发 BeginRequest 事件。
- 引发 AuthenticateRequest 事件。
- 引发 PostAuthenticateRequest 事件。
- 引发 AuthorizeRequest 事件。
- 引发 PostAuthorizeRequest 事件。
- 引发 ResolveRequestCache 事件。
- 引发 PostResolveRequestCache 事件。
- 只需选择一个为应用程序实现 IHttpHandler 的类//看起来只是内部机制
- 引发 PostMapRequestHandler 事件。
- 引发 AcquireRequestState 事件。 就在引发此事件之前,asp.net 会像 session 一样加载状态
- 引发 PostAcquireRequestState 事件。
- 引发 PreRequestHandlerExecute 事件。
- 调用 ProcessRequest 方法
结论:AcquireRequestState事件之前的所有事件都没有Session对象,因为Session不是由ASP.Net加载的,所以任何来自*"AcquireRequestState*的事件* * 事件给 session 对象因此这个问题解决了。 但是,正如我在上面的代码中提到的,需要进行一些检查
关于c# - asp.net:在哪里放置代码以将没有 session 的用户重定向到主页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899028/