c# - asp.net:在哪里放置代码以将没有 session 的用户重定向到主页?

标签 c# asp.net session

我有一个包含大量页面的网络应用程序,其中大部分都需要一些 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 中的事件按以下顺序引发

  1. 验证请求//看起来只是内部机制
  2. 执行 URL 映射//看起来只是内部机制

  3. 引发 BeginRequest 事件。

  4. 引发 AuthenticateRequest 事件。
  5. 引发 PostAuthenticateRequest 事件。
  6. 引发 AuthorizeRequest 事件。
  7. 引发 PostAuthorizeRequest 事件。
  8. 引发 ResolveRequestCache 事件。
  9. 引发 PostResolveRequestCache 事件。
  10. 只需选择一个为应用程序实现 IHttpHandler 的类//看起来只是内部机制
  11. 引发 PostMapRequestHandler 事件。
  12. 引发 AcquireRequestState 事件。 就在引发此事件之前,asp.net 会像 session 一样加载状态
  13. 引发 PostAcquireRequestState 事件。
  14. 引发 PreRequestHandlerExecute 事件。
  15. 调用 ProcessRequest 方法

结论:AcquireRequestState事件之前的所有事件都没有Session对象,因为Session不是由ASP.Net加载的,所以任何来自*"AcquireRequestState*的事件* * 事件给 session 对象因此这个问题解决了。 但是,正如我在上面的代码中提到的,需要进行一些检查

关于c# - asp.net:在哪里放置代码以将没有 session 的用户重定向到主页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899028/

相关文章:

asp.net - 在 Azure 中使用 SQL 作为 session 缓存

php - 在 Linux 上的内存缓存中存储 session 的问题

c# - 应用层和契约

c# - 比较数据集中的单元格和前置信息

c# - 无需安装即可使用 ClickOnce API

javascript - RunOnce for javascript On page Post back.?

c# - 本地化 asp.net 下拉列表

c# - 从母版页获取div的高度

Javascript 确认对话框和鼠标中键/右键单击

session - 无论 setMaxIdleTimeout 的值如何,Java WebSocket session 都会超时