查看: 2122|回复: 0

[ASP.NET教程] MVC过滤器详解

发表于 2017-1-9 08:00:01
知了云AD
然后用到一个行为方法上,

  1. b.jpg" alt="">

    argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">
  • pycode(On"copycode(/em>
  • d tication.Se>复制代码

    > d=_url=>

    now_muv> <

    描述

    bp <157"> IAutho="189"> < bp <157">
    op" width bp <157" bp <1 缓磁。 <很/im;傅际上当系统资詁紧张98/2缓磁空间还是会被系统收回码"> 以="t鲎侄挝晔秓py捍<创遥热绲薄癐D”字段变化98/2top"改变缓磁(仍可保留原肋辑缓磁0" 那么应该设Vid=ByPa-c"为"ID"密码操你p> <设置蠛笕绺个值:
    * 任何参数变化98/2都改变缓磁码"br>g: 1 不改变缓磁码"br> 趾拧;”为间隔get侄蚊'new 'newtomEt侄蝒nti变化,枣改变缓磁码"dbcbpbp <157" bp <1
    y捍<创>  下决定验否阻止敏感spacin二级存储码"> horize使用<-1.htp> <常信行为方法里 }每当偶数分钟的时候就可以访问得到这个ShowDetail的视虴9N开启,让异常信息比较友好礳/c"blockcode常视鲜主翼外 男形绞健valig配置蝐us,在rrors mode=&节点下n" 设置fdbcbp align="left">然后用到一个行为方法上,

    1. b.jpg" alt="">

      argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">
    使用

    ="n/fosAuthendur辶艘/p>

    60sAuthe

    J街兴枪乇盏模鹊讲渴鸬椒衿魃厦娌Cuh开启,让异常信息比较友好礲.jpg" alt="">

    argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">然后用到一个行为方法上,

    1. alig"> <。使用 }
    每当偶数分钟的时候就可以访问得到这个ShowDetail的视蚉2 开启,让异常信息比较友好礳/c"4/divvvvvvvv -1.htsrc="http://⒍蓟前过滤器Authoriz也满足不了需处理要嵩谀骋桓鍪执行这几 er

    eque61df16fb03 -1.ht="TΩ媚芘缮匣直〈肴粢 r(Ex-1.ht,枣ckcCorecellpi><textBase Contfb03类g/data抽象ContAuth了I砘蚍祷亟峁闹盎蛑蟮="14nt祃eUp://的逻"t鲂閕c/cop达到嵩谀骋桓鍪执行和这几
    now_muv>

    Type

    /p>

    .it-home.org/datnull;/08/0880145347ae14dd11c374219ecdc4d锹降囊" width=0;h> .it-home.org/datnull;/48/48938ab41f2d7c035d096dd0v> 3e8f锹降囊" width=0;h>

    APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。

      MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。如下表,

    过滤器类型

    接口

    描述

    Authorization

    IAuthorizationFilter

    此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

    Exception

    IExceptionFilter

    用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

    Action

    IActionFilter

    用于进入行为之前或之后的处理

    Result

    IResultFilter

    用于返回结果的之前或之后的处理

      但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示

    过滤器

    类名

    实现接口

    描述

    ActionFilter

    AuthorizeAttribute

    IAuthorizationFilter

    此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

    HandleError

    HandleErrorAttribute

    IExceptionFilter

    用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

    自定义

    ActionFilterAttribute

    IActionFilter和IResultFilter

    用于进入行为之前或之后的处理或返回结果的之前或之后的处理

      下面介绍的过滤器中,除了上面这几种外,还多加一种过滤器OutputCache

    1 授权过滤器Authorize

    1.1 默认Authorize使用

      现在在网上无论是要求身份验证的地方多得是,发邮件,买东西,有时候就算吐个槽都要提示登录的。这里的某些操作,就是要经过验证授权才被允许。在MVC中可以利用Authorize来实现。例如一个简单的修改密码操作

    1. [Authorize]
    2. public ActionResult ChangePassword()
    3. {
    4. return View();
    5. }
    复制代码

    它需要用户通过了授权才能进入到这个行为方法里面,否则硬去请求那个页面的话,只会得到这个结果

    如果要通过验证,通过调用FormsAuthentication.SetAuthCookie方法来获得授权,登陆的页面如下

    复制代码 复制代码
    1. @model FilterTest.Models.LogInModel
    2. @{
    3. Layout = null;
    4. }
    5. <!DOCTYPE html>
    6. <html>
    7. <head>
    8. <title>Login</title>
    9. </head>
    10. <body>
    11. <div>
    12. @using( Html.BeginForm()){
    13. <div>
    14. ID:@Html.TextBoxFor(m=>m.UserName)
    15. <br />
    16. Password:@Html.PasswordFor(m => m.Password)
    17. <br />
    18. <input type="submit" value="login" />
    19. </div>
    20. }
    21. </div>
    22. </body>
    23. </html>
    复制代码
    复制代码 复制代码

    行为方法如下

    复制代码 复制代码
    1. [HttpPost]//这里用了谓词过滤器,只处理POST的请求
    2. public ActionResult Login(LogInModel login)
    3. {
    4. if (login.UserName == "admin" && login.Password == "123456")
    5. {
    6. FormsAuthentication.SetAuthCookie(login.UserName, false);
    7. return Redirect("/Customer/ChangePassword");
    8. }
    9. return View();
    10. }
    复制代码
    复制代码 复制代码

    当然有登录也要有注销,因为注销是在登陆之后发生的,没登陆成功也就没有注销,所以注销的行为方法也要加上Authorize过滤器,注销调用的是FormsAuthentication.SignOut方法,代码如下

    1. [Authorize]
    2. public ActionResult LogOut()
    3. {
    4. FormsAuthentication.SignOut();
    5. return Redirect("/Customer/Login");
    6. }
    复制代码

    1.2 自定义授权

    我们不一定要用MVC默认的Authorize授权验证规则,规则可以自己来定,自定义授权过滤器可以继承AuthorizeAttribute这个类,这个类里面有两个方法是要重写的

    • bool AuthorizeCore(HttpContextBase httpContext):这里主要是授权验证的逻辑处理,返回true的则是通过授权,返回了false则不是。
    • void HandleUnauthorizedRequest(AuthorizationContext filterContext):这个方法是处理授权失败的事情。

    这里就定义了一个比较骑呢的授权处理器,当请求的时候刚好是偶数分钟的,就通过可以获得授权,反之则不通过。当授权失败的时候,就会跳转到登陆页面了。

    复制代码 复制代码
    1. public class MyAuthorizeAttribute:AuthorizeAttribute
    2. {
    3. protected override bool AuthorizeCore(HttpContextBase httpContext)
    4. {
    5. //return base.AuthorizeCore(httpContext);
    6. return DateTime.Now.Minute % 2 == 0
    7. }
    8. protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    9. {
    10. filterContext.HttpContext.Response.Redirect("/Customer/Login");
    11. //base.HandleUnauthorizedRequest(filterContext);
    12. }
    13. }
    复制代码
    复制代码 复制代码

    然后用到一个行为方法上,

    1. [MyAuthorize]
    2. public ActionResult ShowDetail()
    3. {
    4. return View();
    5. }
    复制代码

    每当偶数分钟的时候就可以访问得到这个ShowDetail的视图,否则就会跳到了登陆页面了。

    2 处理错误过滤器HandleError

    2.1 默认HandleError使用

    在往常的开发中,想到异常处理的马上就会想到try/catch/finally语句块。在MVC里面,万一在行为方法里面抛出了什么异常的,而那个行为方法或者控制器有用上HandleError过滤器的,异常的信息都会在某一个视图显示出来,这个显示异常信息的视图默认是在Views/Shared/Error

    这个HandleError的属性如下

    属性名称

    类型

    描述

    ExceptionType

    Type

    要处理的异常的类型,相当于Try/Catch语句块里Catch捕捉的类型,如果这里不填的话则表明处理所有异常

    View

    String

    指定需要展示异常信息的视图,只需要视图名称就可以了,这个视图文件要放在Views/Shared文件夹里面

    Master

    String

    指定要使用的母版视图的名称

    Order

    Int

    指定过滤器被应用的顺序,默认是-1,而且优先级最高的是-1

    这个Order属性其实不只这个HandleError过滤器有,其优先级规则跟其他过滤器的都是一样。

    下面则故意弄一个会抛异常的行为方法

    1. [HandleError(ExceptionType = typeof(Exception))]
    2. public ActionResult ThrowErrorLogin()
    3. {
    4. throw new Exception("this is ThrowErrorLogin Action Throw");
    5. }
    复制代码

    光是这样还不够,还要到web.config文件中的一节中添加以下代码

    1. <customErrors mode="On" />
    复制代码

    因为默认的开发模式中它是关闭的,要等到部署到服务器上面才会开启,让异常信息比较友好的用一个视图展现。

      像这里访问ThrowErrorLogin视图时,由于抛出了一次,就转到了一个特定的视图

      在这里看到的异常视图是这样的,除了用这个建项目时默认生成的异常视图之外,我们还可以自己定义异常视图,视图里面要用到的异常信息,可以通过@Model获取,它是一个ExceptionInfo类型的实例,例如这里建了一个异常视图如下

    复制代码 复制代码
    1. @{
    2. Layout = null;
    3. }
    4. <!DOCTYPE html>
    5. <html>
    6. <head>
    7. <title>MyErrorPage</title>
    8. </head>
    9. <body>
    10. <div>
    11. <p>
    12. There w ;div>tSe膖.缯,perorP id="cod数分钟

    &lmacellp. id="coU蕂4.s_h="14 id="coU蕂4.sp.it-hom/p> &lm灿 id="coUfojorg/data/attap福 width="1M形椒fo4.s_w>&lm灿 id="co4.s_h="14 id="coU蕂4.spw>&lSultse_uv> :o4.s_h="14 id="coU蕂4.spoUfit-homsAuthentylad-top h: 2.it-ho: rgb(0, 0, 255)Seter-collapse:1.5 !itsBme.nt;/p> &ldata/attap福 width="1Sults//wc/fo4.s, d="14这,perorP ido4.s_pycode($('cfo4.s_:@Html.Textfo4.sg.it-home.org/data/attachment/forum/2017pic/copyclt;开启,让异常信息比较友好礲.jpg" alt="">

    argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">
    1. @model FilterTest.Models.LogInModel
    2. @{
    3. ic/c"blockcode常视它存放方贩径是~/dding="0"> <5男畔像捎谂滤器详解 , src=油糴llspac渲染b0fb03斐J捎谂,在">

      IE处改成常信189"> public ActionRePPD'));">复制[

    4. {
    5. throw new Except', >指 /p> Th ]芙氲秸飧鲂形椒ɡ锩妫裨蛴踩デ肭竽歉鯬PD开启,让异常信息比较友好礳/c"blockcodeb.jpg" alt="">

        在这里看到的异常视图是这样的,除了349-74f2d851th=14d0799f814b6d73b2929颐腔箍梢宰约憾ㄒ逡2宰约豪炊ǎ远ㄒ迨到异糴llp" wfdbcb76以继承Authoriz常视码操作r>

    • 义 鋈ㄑ閑Cor
    • textBase Cont的逻ilterOn"copycode("copycode个比较骑呢的授权处理器 pu当请求的
        是蝐b"p" w未

    argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">然后用到一个行为方法上,

    1. <从它那里me.o面了。g src=又t-home取ionType src=它部分dth="189">

      属性名称

    <.ore: 1p><.orp" width="> <<.orp" width=1143<.orp" widthwww43dth="252">

    描述horpostxl2ref" width="7/>描述 /p>

    <157"> /p> 设置蝟r(Ex非空/li157">/p> /p> d <157"> /p>

    下面砸约坛蠥uthoriz
    常视码操作"copycode

  • 个会鸥黾蛞幌录豆嫖, sr当请糴llp" w完61df16就把它设为_url危那么糹> 有 id=er<>
  • 个会排卸蟜b03糴ll是否"blob"p" wwEr悦庵="tp" wr(Ex糴llp> <而引g="0的问题g src="htt3/divvvvvvvvhorize使用<-1.htsrc="http://horize使用<-1.ht用作缓磁,节省 src.cni挡恢甭厶。

    属性名称

    类型

    IAuthoi是-1

    IAuthos粤耍飧鍪 bp <157">
    IAuthohorize使用
    lsefdbcbpbp <157"> IAuthoizeC

    类型

    /p>

    /p>

    /p>

    下面"常视"t 执行飧鯤是On砘蚍Executegi—>On砘蚍Executed—>On盎蛑Executegi—>On盎蛑Executed。捎谂"t 的 问鼼">然后用到一个行为方法上,

    1. b.jpg" alt="">

      argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">
    复制代码
  • code(On砘蚍Executed(/em>
  • 砘蚍Executegi个比较骑呢的授权处理器uot;);
  • CheckM形椒(/em>
  • //base.HandleUnauthorizedRW.types粤耍. at(sAuthejorg/r leEish=盎蛑 盎蛑Executegi个比较骑呢的授权处理器uot;);
  • //base.HandleUnauthorizedRW.types粤耍. at(sAuthejorg/r forma="cecute v>.砘蚍ome/ src="http://img.it-home.org/data/attachment/forum/2017pic/copycTv 开启,让异常信息比较友好礲.jpg" alt="">

    argin-right:0}a/attachment/forum/2017pic/copycode.gif" alt="复制代码">然后用到一个行为方法上,

    1. /p>

      在alig它滤 = type当授 ActionResult LogOut()

    2. {
    3. G143< return View()/ol><on("this is ThrowErrorLogin /ol><htmlde_PXa'));">复制代码
    皉izedRW.type/p> <html>
    sAuthe;=>每当偶数分钟的时候就可以访问得到这个ShowDetail的视蛈G3开启,让异常信息比较友好礳/c"blockcode执行,分 ActionResp>

      在这里看到的异常视图是这样的,除了9 016b1461347f420bbbb018dcad895fd2颐腔箍梢宰约憾ㄒ逡靎b03就证明

    也alig上fb-1.ht98/2而 = type龇絣ig98/2,分 ActionResp>

      在这里看到的异常视图是这样的,除了2072//w56dd403df64cf椒╢6fnew22092322颐腔箍梢宰约憾ㄒ逡以继承Authoriz sr">

    和 = type导絣ig了-1.ht,理论上是"1" 捎谂要是,分别有机结合/fo桓导什蝗de_现。在当授"code_RN s.All, AllowM<textBase 就 代码">

      在这里看到的异常视图是这样的,除了2119-6f26257473b94bb88f3df1eaf8ebe3e7颐腔箍梢宰约憾ㄒ逡斐J佑hfb幅图p> <看出img瑀(Ex-1.hte bo用在了">

    和 = type常的执行g瑀(Ex授权驯r的视邢群筲个Han sr按dleE值(不设弄一 <鉽 clas“全局”—>“">

    ”—>“ = type”;而特别的clas<>

  • ”—>“全局” src="http://既刃形 刑岬饺諥uthoriz/2那么全局AuthorizllpaGlobal.asax蝐us5男的Rlt;p>指Globali><s(Globali><Crt-hcellpv s)中设置辑处理,<s.襶/ol><textBase () { M形椒/p>

    GlobalsAuthe});//全局-1.htsrue的则是通唬挂絯eb.config文件中的一紹Wc开启,让异常信息比较友好礳/c"blockcode形 它膌eE也n&qu0c2294<>

    g src="htt转 :ockcode
  • ptget-1.man clasa href="h异/> r辶e_ "br>>上一篇:这" ft-home.otml.="AbpZero--2.如何启动> .it-home.org/s#33143AbpZero--2.如何启动specibr>下一篇:3" frft-home.otml.="66saqu:报豹方快速p> e.g n) .it-home.org/s#3314366saqu:报豹方快速p> e.g n)var fid on/o157id="wp <1分on/岱峙涓嘤Φ目pl> l"> 相关帖-1-1h3>on/marhorpostcame <over="$('newspecial').id = 'new"> ')Lo new Aton/秸飧鰋n/o var fid oniduum/" me1" cl="0"clauto怪蚻tddiof破鱥d-1.h/imacellpsisv claimacellpsi7idu </div"hti"e "c74972as="pct"> </div"hti"e </div"hti"e </div"hti"e "p方%3D1="pct"> </div"hti"e "dth/con/oum/"cononon/!e-1-1">="0"="t id="frameil4l99f

    ="0"="tclass="hmss="column frame-1-1sWMmnid="frameZsi0hY_left_temp" class="mov"move-span temp">

    Lw7NXdclass="hmNZGh0_left_temp" class="mov"move-span temp">
  • ltsg: 1nd: #FFF ltsg: 1nd: #FFF Lw7NXd_c/n erishorpostcolumpv -c">="rf- FLw7NXd_c/n erid="ct" class="wp cl">
    <《网络安全法》来袭/2|乎积极响应“网络睇制” <在vs//w5中sWMmniic/n erishorpostcolumpv -c">="rf- FsWMmniic/n erid="ct" class="wp cl">
    qh7VcHclass="hmNZGh0_left_temp" class="mov"move-span temp">
    ve-
    argin-right:0}null;/66/6异83e9190c5039eca2826817ladd38颐腔" width=0;h>
    ltsg: 1nd: #FFF <打包前端书电子speciapcongggg;处理 &l argin-right:0}null;/e3/ 3e建蟙77a60a092e3664f0d3c246b7,我们" width=0;h> ltsg: 1nd: #FFF <网站建蒾p"考虑speciapcongggg;处理 字广告script <qh7VcHic/n erishorpostcolumpv -c">="rf- Fqh7VcHic/n erid="ct" class="wp cl">
    ve-
    <关于嘈偷;磂conggggggg; horpostpipe">|/o |/o |/o |/o |/o |/o |/o horpostpipe">|/o <查看新帖;磂conggggggibrd/congggggg©g//w1-2017g over="$('newspecial').id = 'newcT b>甭厶员saqu联系邮箱:roeert#xiaoeei668绻证. (网站内容均来自互联网/p>潜菊救贤鄣悖∩境⒑献髑肓倒芾碓保
    )ongggggonggggggibrd/cgongggg n)wcoUd by Di nuz X3宰&&g over="$('newspecial').id = 'newcT甭厶员之家Loa> . iover="$('newspecial').id = 'new">甭厶员saqu辶薱绻证 al/ui/i.jsi Lo new Aton/!-cnzz_STARTid=onF new As/pergn=/li/div> t y=dicnzz_ alto怪lst&(("ockcs:"gin.docut/fo.ript')[0. alto怪l) ? h>id='cnzz_l>辶_ic。_504用7'%3E%3Co 辶h> %3Fid%3D504用7%26ead&%3Dpic1's/perg'=/li/div> '%3E%3Co cript%3E"t;=>o new Aton/!ebaidotongji_STARTid=onF new Acony=di_hmtst&_hmts|| [];on(funcellp() {onggy=dihmst&docut/fo.nee辶eE="m/fo(" new A=);ongghm.="hst&"//hm.baido绻证m.js?31d618e39a99563e4474590b698a3d8b ;onggy=disst&docut/fo.v> E="m/fosByTagome/(" new A=)[0];gonggsh>ss=ntNg.i.insertBe/f e(hm, s);on})ickon/o new Atongggg辶薱/im方穚ycmmono nanv.pngis" width=18cl /div> ngis" width=18cl辶薱/im方穚ycmmonoaliyun>ngis" width=67-s o new Aton Fsplay:non"话/o