Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 740|回复: 0

ASP.NET MVC 过滤、异常过滤器

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-7 15:42:17 | 显示全部楼层 |阅读模式

    记录下过滤器的学习—_—

    APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前后如果想再加一些额外的逻辑处理,这样会造成大量代码的重复使用,这不是我们希望的。这时就到了过滤器出场的时候啦。

    但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);

    各种信息如下表所示

     

      

    过滤器 类名 实现接口  描述
    ActionFilter  AuthorizeAttribute IAuthorizationFilter  此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法
    HandleError   HandleErrorAttribute  IExceptionFilter  用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 
    自定义   ActionFilterAttribute  IActionFilter和IResultFilter  用于进入行为之前或之后的处理或返回结果的之前或之后的处理 AuthorizeAttribute过滤器

     首先,我们需要搞清楚什么是过滤器,简单的说过滤器也是一个类,这个类继承自过滤器类

    public class MyAuthorizeAttribute:AuthorizeAttribute 
    {
       protected override bool AuthorizeCore(HttpContextBase httpContext) 
      {
      //...
       } 
      protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
      {
      //...
       } 
    }

     

     然后用到方法上

    [MyAuthorize]
    public ActionResult Show()
    {
        return View();
    }

     

    上述用到的是一个自定义授权验证规则,当然如果默认的Authorize过滤器足够我们使用我们也可以使用默认的Authorize,想要自己定义一个自定义授权类可以继承AuthorizeAttribute类,然后重写两个方法:

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

    例如:我们可以在AuthorizeCore中确认是否授权

    return base.AuthorizeCore(httpContext);

    在授权失败类中返回到登陆。。。

    在登陆验证成功后跳转页面前完成授权

    FormsAuthentication.SetAuthCookie(login.UserName, false);

    注销

    FormsAuthentication.SignOut();

    当然注销实在登陆后发生的,所以注销时也要加上[Authorize]授权

     

    登陆页

    @model FilterTest.Models.LogInModel
    
    @{
    
    Layout = null;
    
    }
    
    <!DOCTYPE html>
    <html>
      <head>
        <title>登陆</title>
      </head>
      <body>
        <div>
        @using( Html.BeginForm())
        {
        <div> ID:@Html.TextBoxFor(m=>m.Uid) <br />
    
        Password:@Html.PasswordFor(m => m.Pwd) <br />
        
        <input type="submit" value="登陆" /></div>
        }
        </div>
      </body>
    </html>

     

    [HttpPost]//这里用了谓词过滤器,只处理POST的请求
    
    public ActionResult Login(LogInModel login)
    {
        if (login.Uid== "admin" && login.Pwd == "123456")
        {
        FormsAuthentication.SetAuthCookie(login.UserName, false);
        return Redirect("/跳转页。。。");
        }
        return View();
    }

     

    注销

    [Authorize]
    public ActionResult LogOut()
    {
        FormsAuthentication.SignOut();
        return Redirect("/登陆页。。。");
    }

     

    Exception过滤器

    创建MyHandleErrorAttribute类,继承HandleErrorAttribute类:

    public class MyHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
        Exception ex = filterContext.Exception;
        //写日志
        //Log
        filterContext.Result = new RedirectResult("~/error.html");
        filterContext.ExceptionHandled = true;
        base.OnException(filterContext);
    }

     

    然后使用MyHandleErrorAttribute类

    [MyHandleErrorAttribute]
    public ActionResult GetErr()
    {
        throw new Exception("this is ThrowErrorLogin Action Throw");
    }

     

    跳转不了还要到web.config文件中的<system.web>一节中添加以下代码

    <customErrors mode="On" />

    当访问这里的GetErr时由于抛出异常会跳转到特定的视图。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 00:25 , Processed in 0.064669 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表