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

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

最新文章

  1. 删除某一BSC在某一时间段内的数据
  2. VS2013安装oepncv2.4.10 以及opencv 3.0.0
  3. 一步一步学android之布局管理器——RelativeLayout
  4. debug jdk
  5. Hive Server 2 安装部署测试
  6. win7下怎样设置putty免用户名密码登陆
  7. 百度地图移动版API 1.2.2版本(Android)地图偏移的最佳解决办法
  8. 老李分享:DBA
  9. Ionic3 编程-应用启动进入引导页
  10. maven国内镜像(国内oschina的maven服务器关了)
  11. 2018-2019-2 20165231 王杨鸿永 Exp6 信息搜集与漏洞扫描
  12. web应用/路由控制/视图函数/单表多表操作
  13. asp.net 网页跳转的几种常用方法
  14. day22 Pythonpython 本文json模块
  15. 19. SpringBoot_web开发-使用外部Servlet容器&amp;JSP支持
  16. solus下 修改 crate-react-app 的默认下载依赖方式为 yarn
  17. Qt下libusb-win32的使用(二)批量读写操作
  18. springboot jpa 多条件查询(多表)
  19. cocos2d-x3.0 用CCDictionary写文件
  20. 《linux系统及其编程》实验课记录(四)

热门文章

  1. LeeCode——Combine Two Tables
  2. Django 练习班级管理系统五 -- 查看老师列表
  3. sqlmap 注入的方法及技巧
  4. Factorization Machine算法
  5. 《Linux就该这么学》课堂笔记01 linux初识
  6. 201871010118-唐敬博《面向对象程序设计(java)》第十周学习总结
  7. hbase链接失败
  8. c语言中各个循环的流程图——方便记忆
  9. The Preliminary Contest for ICPC Asia Shanghai 2019 C. Triple
  10. 在分页中,删除操作后,AJAX重载刷新当前页