一、自定义权限认证特性 CheckLoginAttribute

  基于.net core mvc的验证Session登陆状态

1.新建一个.net core mvc项目

2.在Models文件夹下面添加一个类MyAttribute,专门用来保存我们定义的特性

  在这里我只写了CheckLoginAttribute用来验证登陆情况

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace AttributeStudy.Models
{
public class MyAttribute
{ }
public class CheckLoginAttribute : Attribute,IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)//方法执行后执行
{ } public void OnActionExecuting(ActionExecutingContext context)//方法执行前执行
{
if(context.HttpContext.Session.GetString("LoginName")==null)
{
context.Result = new RedirectResult("Contact");//如果不存在这个Session则表示登陆不成功,跳到Contact页面
}
else
{
          //否则,不做操作。
}
}
} }

  因为这里不是controller,所以,我们要得使用session得用注入的context来调用

  而且,在.Net core使用Sesion还得在Startup添加配置

ConfigureServices下面添加          services.AddSession();
Configure下面添加 app.UseSession();

  HomeController如下:

using AttributeStudy.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics; namespace AttributeStudy.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
public void SetSession(int i)//做测试用,添加LogonName这个Session
{
HttpContext.Session.SetString("LoginName", "");
}
public void RemoveSession(int i,int j)//做测试用,删除LogonName这个Session
{
HttpContext.Session.Remove("LoginName");
}
[CheckLogin]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
} public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
return View();
}
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

  这样我们检测登陆特性已经可以演示了,启动后,在网页点击About,会先检执行CheckLoginAttribute的OnActionExecuting做登陆验证。

二、自定义权限认证特性 CustomAuthorizeAttribute

  基于.net mvc 的验证Session登陆状态

1.新建一个.net mvc项目

  添加控制器Login、并在控制器index右键添加index视图

    public class LoginController : Controller
{
// GET: Login
public ActionResult Index()
{
return View();
} public string Login()
{
HttpContext.Session["StudyAOPSession"] = "kxy&123";
return "登录成功";
} public string Out()
{
HttpContext.Session["StudyAOPSession"] = null;
return "已退出";
}
}

  index视图

@{
ViewBag.Title = "Index";
} <h2>请登录!</h2>
@Html.ActionLink("登录", "Login", "Login")
@Html.ActionLink("退出", "Out", "Login")

2.新建文件夹CustomAttribute,并添加类 CustomAuthorizeAttribute

    public class CustomAuthorizeAttribute: AuthorizeAttribute
{
     // 加上这个特性 会先执行这个函数
public override void OnAuthorization(AuthorizationContext filterContext)
{
var StudyAOPSession = filterContext.HttpContext.Session["StudyAOPSession"];
// 判断登录Session是否存在、账号密码是否正确(这里只是模拟一下)
if (StudyAOPSession == null || !StudyAOPSession.ToString().Equals("kxy&123"))
{
filterContext.Result = new ViewResult() {
ViewName = "~/Views/Login/index.cshtml"
};
}
}
}

  这样我们就新建好了一个用来验证登陆的特性

  加特性的三个地方

  1、Action:方法注册、指定某个方法

  2、Controller:控制器注册、指定控制器下面的所有方法

  3、FilterConfig:全局注册,在App_Start 里面的 FilterConfig

    public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthorizeAttribute());// 我们加的特性
}
}

3.允许匿名访问  AllowAnonymous

  AllowAnonymous不是添加了就有效,需要在自定义特性判断是否有添加AllowAnonymous,已经添加了就是允许匿名,直接return,不做筛选操作

  修改类:CustomAuthorizeAttribute

    public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
return;//判断控制器是否允许匿名
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
return;//判断Action是否允许匿名
var StudyAOPSession = filterContext.HttpContext.Session["StudyAOPSession"];
// 判断登录Session是否存在、账号密码是否正确(这里只是模拟一下)
if (StudyAOPSession == null || !StudyAOPSession.ToString().Equals("kxy&123"))
{
filterContext.Result = new ViewResult()
{
ViewName = "~/Views/Login/index.cshtml"
};
}
}
}

  AllowAnonymous特性可以注册在Controller或者Action上面

三、自定义捕捉异常特性 CustomHandleErrorAttribute

    public class CustomHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
return;//异常已被处理,这里不再处理
filterContext.Result = new ViewResult()
{
//捕捉到未被处理的异常(也就是没有catch掉的异常),转到错误页,显示错误信息
ViewName = "~/Views/Shared/Error.cshtml",
ViewData = new ViewDataDictionary<string>(filterContext.Exception.Message)
};
filterContext.ExceptionHandled = true;//标记已处理
}
}

  Error页如下

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width" />
<title>错误</title>
</head>
<body>
<hgroup>
<h1>错误。</h1>
<h2>处理你的请求时出错。</h2>
<h3>@Model</h3>
</hgroup>
</body>
</html>

  CustomHandleErrorAttribute 可以进行方法、控制器、全局注册

  一般而言,捕捉异常会用全局注册

    public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());//这是自带的异常捕捉特性,现在换成我们自己的
filters.Add(new CustomHandleErrorAttribute());
}
}

  软谋教育举例的七大异常:

    

  可以看出5、6、7 这三个场景并不能被捕捉到,还是会出现异常黄页

  可以通过在Global.asax.cs 添加如下函数进行异常捕捉

        /// <summary>
/// 保底全局异常处理,任何最终没有被处理的异常都会来这里
/// 但是获取的信息比较粗略,所以是作为补充
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_Error(object sender,EventArgs e)
{
var error = Server.GetLastError();
Server.ClearError();// 将错误清除掉
Response.Write(error.Message);
}

  注意,函数名和参数必须是这样  不能改

  PS:异常捕捉特性可以捕捉  权限认证特性和方法过滤特性里面发送的异常

四、自定义方法过滤特性 CustomActionFilterAttribute

  可用于页面压缩

1.特性代码演示

    /// <summary>
/// 自定义Action过滤特性
/// </summary>
public class CustomActionFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 动作执行前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("动作执行前<br />");
}
/// <summary>
/// 动作执行后
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("动作执行后<br />");
}
/// <summary>
/// 视图加载前
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("视图加载前<br />");
}
/// <summary>
/// 视图加载后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("视图加载后<br />");
}
}

  这个特性分别是网页面添加一句话,在Home的About方法注册一下这个特性

        [CustomActionFilter]
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}

  页面如下:

  从这里我们可以看出,在Action执行前后四个特性函数的执行顺序

2.使用函数 OnActionExecuting 进行页面压缩

  我们先看一下没有压缩的About网页的 请求头 和 响应头

    

  请求头中,页面支持的压缩类型有 gzip,所以,我们可以对这个页面进行 gzip压缩

  响应头中,页面传输数据长度为1830

  接下来看一下特性代码中 OnActionExecuting 函数

        public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string acceptEncoding = filterContext.HttpContext.Request.Headers["accept-encoding"];
if (string.IsNullOrEmpty(acceptEncoding))
return;
else
{
if (acceptEncoding.ToLower().Contains("gzip"))
{
// 页面支持 gzip压缩
var response = filterContext.HttpContext.Response;
response.Filter = new GZipStream(response.Filter,CompressionMode.Compress);//对响应流进行gzip压缩
response.AddHeader("content-encoding", "gzip");//告诉浏览器要解压
}
}
}

  给About添加特性后

    

  回复的页面传输数据长度为 716 ,比之前少了很多,内容编码为gzip,浏览器会自动对页面进行解压

.Net core 使用特性Attribute验证Session登陆状态的更多相关文章

  1. 前端验证用户登陆状态(vue.js)

    首先用户需要进行登陆(请求登陆接口),接口请求成功之后后台会返回对应的用户信息(可以把用户信息存放在浏览器缓存中),并且后台会设置浏览器的cookie值(可以在network->header-& ...

  2. Cookie、Session登陆验证相关介绍和用法

    一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...

  3. 过滤器+用session验证是否登陆过

    过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override ...

  4. 装饰器实现session登陆 验证功能

    装饰器 登陆验证功能 1.装饰器模板 from django.shortcuts import render, redirect, HttpResponse from django.conf impo ...

  5. Python3.6下使用会话session保持登陆状态

    本次工具主要利用python easygui模块的inputbox让用户首次输入登陆信息,作为网站requests-post请求的data字段,观察XHR(异步加载)的数据包,构造post请求,利用r ...

  6. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

  7. js进阶 14-2 如何用ajax验证登陆状态(这里用load方法)

    js进阶 14-2 如何用ajax验证登陆状态(这里用load方法) 一.总结 一句话总结:$('#test').load('test.php?password=1234560'),这样就get方式提 ...

  8. IOS开发之记录用户登陆状态

    上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登 ...

  9. Webform Session Cookies状态保持

    Request对象的五个集合: ①.QueryString:用以获取客户端附在url地址后的查询字符串中的信息. 例如:stra=Request.QueryString ["strUserl ...

随机推荐

  1. 如何计算Java对象所占内存的大小

    [ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId ...

  2. Adapter的getView

    http://blog.csdn.net/yelbosh/article/details/7831812 BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组 ...

  3. 计算机基础:计算机网络-chapter3

    数据链路层,给两个相邻节点传输数据. 数据链路:物理链路+通信协议. 数据链路层使用的信道主要有点对点信道和广播信道两种. 一.点对点信道的PPP协议: 用三层模型来研究数据链路层,不管在哪一链路上的 ...

  4. Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题

    Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题 以前是正常的,后来在 server.xml 文件的 <Host> </Host> ...

  5. File的创建

    package cn.lijun.demo3; import java.io.File; import java.io.IOException; // 创建文件功能 如果文件已经存在 不再创建 pub ...

  6. python自动化开发-[第二十三天]-初识爬虫

    今日概要: 1.爬汽车之家的新闻资讯 2.爬github和chouti 3.requests和beautifulsoup 4.轮询和长轮询 5.django request.POST和request. ...

  7. Potplayer播放器使用笔记

    Potplayer播放器使用笔记 1.暂停-播放的快捷键是 空格键2.C播放视频的加速倍数3.X播放的时候减速的倍数 Tab键:显示一下播放的信息,很多 Enter键:全屏或是缩小播放窗口 全屏拉伸快 ...

  8. httprouter使用pprof

    httprouter使用pprof 参考:https://github.com/feixiao/httpprof 性能分析参考:https://github.com/caibirdme/hand-to ...

  9. thinkpad yoga 12 / thinkpad s1 yoga / WS860

    s 序号 IP地址 MAC地址 主机名 设备商 1 192.168.3.6 34-02-86-29-46-8B Intel(R) Dual Band Wireless-AC 7265 Intel公司/ ...

  10. Sql Server时间格式化笔记

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE() ...