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

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 == "")
{
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时由于抛出异常会跳转到特定的视图。

ASP.NET MVC 过滤、异常过滤器的更多相关文章

  1. [Asp.net MVC]HandleErrorAttribute异常过滤器

    摘要 在asp.net mvc中除了使用try...catch/finally来处理异常外,它提供了一种通过在Controller或者Action上添加特性的方式来处理异常. HandleErrorA ...

  2. Asp.Net MVC<五>:过滤器

    ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...

  3. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)

    概念介绍 异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理 如果我们需要创建异常过滤器需要实现IExceptionFilter接口. nam ...

  5. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  6. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  7. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  8. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  9. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

  10. ASP.NET MVC 中的过滤器

    这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨. 1. ActionFilter 方法过滤器: 接口名为 IActionFilter ,在控制器方法调用前/后执行. 在新建的MVC ...

随机推荐

  1. Codeforces Round #304 (Div. 2)(CF546E) Soldier and Traveling(最大流)

    题意 给定 n 个城市,m 条边.人只能从走相邻边相连(只能走一次)的城市. 现在给你初始城市的每一个人数,再给一组每个城市人数.询问是否可以从当前人数变换到给定人数.如果能,输入"YES& ...

  2. 《快活帮》第七次作业:团队项目设计完善&编码

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十一 团队作业7-团队项目设计完善&编码 团队名称 快活帮 作业学习目标 掌握 ...

  3. 弗洛伊德算法(Floyd )

    package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...

  4. wait函数和waitpid的使用和总结

    wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内 ...

  5. Linux基于FPM制作RPM包(以Nginx为例)

    1.搭建Epel  Yum源  安装在线yum源 [root@localhost ~]# rpm -ivh epel-release-latest-.noarch.rpm //安装扩展源 [root@ ...

  6. MySQL实战45讲学习笔记:第二十一讲

    一.引子 在上一篇文章中,我和你介绍了间隙锁和 next-key lock 的概念,但是并没有说明加锁规则.间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上 ...

  7. [LeetCode] 377. Combination Sum IV 组合之和之四

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  8. WebSocket--客户端

    WebSocket 是 HTML5 提供的一种在单个TCP连接上进行全双工通讯的协议. WebSocket 使得客户端和服务端通讯,数据交换更加简单,而且允许服务端主动向客户端发送数据.在WebSoc ...

  9. 小i机器人

    //机器人回复 function xiaoirobot($openid, $content) { //定义app $app_key = ""; $app_secret = &quo ...

  10. Visual Studio 2017 无法启动,进程中却有devenv.exe运行的解决办法

    双击Visual Studio 2017,系统没有响应,在任务管理器中却发现devenv.exe 已经在运行. 解决办法:启动services.msc.找到Visual Studio Standard ...