zoukankan      html  css  js  c++  java
  • ASP.NET MVC Action Filters中有趣的Http Headers

    ASP.NET MVC Action Filters中有趣的Http Headers

            你想要你的Asp.net mvc 应用程序在一段时间后自动重定向一个指定的URL,是的你能用javascript中window.location来实现,除了javascript外呢?看这个代码:

    1. [AutoRefresh(ControllerName = "Home", ActionName = "About", DurationInSeconds = 10)]   
    2. public ActionResult Index1()   
    3.   
    4. [AutoRefresh(ActionName = "About", DurationInSeconds = 15)]   
    5. public ActionResult Index2()   
    6.   
    7. [AutoRefresh(RouteName = "ByFavoriteRoute", DurationInSeconds = 30)]   
    8. public ActionResult Index3()   
    9.   
    10. [AutoRefresh(DurationInSeconds = 45)]   
    11. public ActionResult Index4()  

    如果浏览器在特定期间是闲置的,它将自动重定向到那个Action.如果你不指定任何action/controller/route,它将自动重定向当前URL.怎样?好的我只是使用/滥用一些http header,来看下面:

    1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]   
    2. [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]   
    3. public class AutoRefreshAttribute : ActionFilterAttribute   
    4. {   
    5.     public const int DefaultDurationInSeconds = 300; // 5 Minutes   
    6.   
    7.     public AutoRefreshAttribute()   
    8.     {   
    9.         DurationInSeconds = DefaultDurationInSeconds;   
    10.     }   
    11.   
    12.     public int DurationInSeconds   
    13.     {   
    14.         get;   
    15.         set;   
    16.     }   
    17.   
    18.     public string RouteName   
    19.     {   
    20.         get;   
    21.         set;   
    22.     }   
    23.   
    24.     public string ControllerName   
    25.     {   
    26.         get;   
    27.         set;   
    28.     }   
    29.   
    30.     public string ActionName   
    31.     {   
    32.         get;   
    33.         set;   
    34.     }   
    35.   
    36.     public override void OnResultExecuted(ResultExecutedContext filterContext)   
    37.     {   
    38.         string url = BuildUrl(filterContext);   
    39.         string headerValue = string.Concat(DurationInSeconds, ";Url=", url);   
    40.   
    41.         filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);   
    42.   
    43.         base.OnResultExecuted(filterContext);   
    44.     }   
    45.   
    46.     private string BuildUrl(ControllerContext filterContext)   
    47.     {   
    48.         UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);   
    49.         string url;   
    50.   
    51.         if (!string.IsNullOrEmpty(RouteName))   
    52.         {   
    53.             url = urlHelper.RouteUrl(RouteName);   
    54.         }   
    55.         else if (!string.IsNullOrEmpty(ControllerName) && !string.IsNullOrEmpty(ActionName))   
    56.         {   
    57.             url = urlHelper.Action(ActionName, ControllerName);   
    58.         }   
    59.         else if (!string.IsNullOrEmpty(ActionName))   
    60.         {   
    61.             url = urlHelper.Action(ActionName);   
    62.         }   
    63.         else  
    64.         {   
    65.             url = filterContext.HttpContext.Request.RawUrl;   
    66.         }   
    67.   
    68.         return url;   
    69.     }   
    70. }  

    不能想像适当使用这个action filter,可能你能在你你要显示一些在线统计之类页面任何iframe中使用它.好的,现在让我们试试滥用这个Refeash header,这时它是一个相当通的场景.

    你要安全的使用(标记为已认证)action,当会话过期时自动重定向到登陆页面.现试试这个:

    1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]   
    2. [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]   
    3. public class AutoRedirecToLogin : ActionFilterAttribute   
    4. {   
    5.     public override void OnResultExecuted(ResultExecutedContext filterContext)   
    6.     {   
    7.         string url = FormsAuthentication.LoginUrl;   
    8.         int durationInSeconds = ((filterContext.HttpContext.Session.Timeout * 60) + 10); // Extra 10 seconds   
    9.   
    10.         string headerValue = string.Concat(durationInSeconds, ";Url=", url);   
    11.   
    12.         filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);   
    13.   
    14.         base.OnResultExecuted(filterContext);   
    15.     }   
    16. }  

    当会话过期时,不需要额外的用户点击它将自动重定向到登陆页面.

    警告:如果你要你的URL被搜索引擎收录为索引,那以不要使用Refresh meta 头(验证过Google,其它的不确定).例如,你的页面A要自动重定向页面B,那么页面A只有这个头,在那种情况下页面A将不会被索引.

    Roni Schuetz 刚通知他有一个聚集 mvc action filters的项目在CodePlex 上, 对于他的项目这两个应该是最佳候选.

    Author: Petter Liu   http://wintersun.cnblogs.com       Source

  • 相关阅读:
    《Linux C一站式学习》第七章 结构体
    《Linux C一站式学习》第三章 简单的函数
    《Windows程序设计》第一章 起步
    CSS在线课程学习笔记
    《Windows程序设计》第三章 窗口和消息
    window.open与window.showModalDialog中主页面与从页面间的通信(原创) 中庸
    php文件实现将大文件导入到mysql数据库中
    我为何爱读代码?你为何也应当爱?
    解决phpMyAdmin导入mysql数据库超过2M的问题
    对linux交换分区swap的一些认识总结
  • 原文地址:https://www.cnblogs.com/wintersun/p/1447922.html
Copyright © 2011-2022 走看看