asp.net中的Filter类型其实是被当作单例的
Filter对请求进行过滤。例如,在进行身份验证的基础上增加一些权限判断,对于身份验证通过的用户,检测其是否有开通UserSpace,如果没有则在Response中说明。示例代码如下:
public class ApiAuthorizeAttribute : AuthorizeAttribute
{
private bool _isBaseAuthorized = false;
protected UserSpace UserSpace { get; set; }
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
if (UserSpace == null)
UserSpace = await GetUserSpaceFromDb(actionContext);
await base.OnAuthorizationAsync(actionContext, cancellationToken);
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
if (!base.IsAuthorized(actionContext))
{
_isBaseAuthorized = false;
return false;
}
else
{
_isBaseAuthorized = true;
if (UserSpace == null) return false;
return true;
}
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
if (!_isBaseAuthorized)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new JsonContent("您的身份验证未通过!")
};
}
else
{
if (UserSpace == null)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new JsonContent("您没有开通用户空间!")
};
}
}
}
}
测试的时候,会发现无论是哪个用户登录,都只会使用第一个用户的UserSpace实例,好像ApiAuthorizeAttribute被缓存了一样。其实是因为Asp.net提供这个实例的时候进行了缓存,所以每次请求都是拿到相同的实例,也就是第一个请求时实例化的对象。这个问题也很好解决:只要在OnAuthorizationAsync的结束的时候把UserSpace对象重置为null就好了,同时把UserSpace传递到当前请求中保存起来。
public class ApiAuthorizeAttribute : AuthorizeAttribute
{
const string KEY_USER_SPACE = "KEY_USER_SPACE";
private bool _isBaseAuthorized = false;
protected UserSpace UserSpace { get; set; }
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
if (UserSpace == null)
UserSpace = await GetUserSpaceFromDb(actionContext);
actionContext.ControllerContext.Request.Properties.Add(KEY_USER_SPACE, UserSpace);
UserSpace = null; //Because this instance will be reused next time.
await base.OnAuthorizationAsync(actionContext, cancellationToken);
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
if (!base.IsAuthorized(actionContext))
{
_isBaseAuthorized = false;
return false;
}
else
{
_isBaseAuthorized = true;
if (UserSpace == null) return false;
return true;
}
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
if (!_isBaseAuthorized)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new JsonContent("您的身份验证未通过!")
};
}
else
{
var userSpace = actionContext.ControllerContext.Request.Properties[KEY_USER_SPACE] as UserSpace;
if (userSpace == null)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new JsonContent("您没有开通用户空间!")
};
}
}
}
}
asp.net中的Filter类型其实是被当作单例的的更多相关文章
- (转)ASP.NET中常见文件类型及用途
从入门导师那继承来的习惯,也是加上自己的所谓经验判断,一直对WEB开发不太感冒,可惜呀,从业近二十年,还得从头开始对付HTML.CSS.JS.ASPX,以前的经验,用不上啦!!!先从好好学习ASPX开 ...
- 注解在Spring中的运用(对象获取、对象单例/多例、值的注入、初始化/销毁方法、获取容器)
1.注解的方式获取对象 (1)导包: (2)书写配置文件(要保证已经导入了约束): <?xml version="1.0" encoding="UTF-8" ...
- ASP.NET中IHttpHandler与IHttpModule的区别(带样例说明)
IHttpModule相对来说,是一个网页的添加 IHttpHandler相对来说,却是网页的替换 先建一个HandlerDemo的类 using System; using System.Colle ...
- Attribute自定义特性+Asp.net MVC中的filter详解
转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...
- Attribute(两)——定义自己的特色+Asp.net MVC中间filter详细解释
部分博客是预先定义的有关特性的一些基本特征,同时还Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自己定义特性服务的AttributeUsage,这篇博客主要是通过filter ...
- iOS中浅淡UIApplication单例-b
在iOS的操作系统中 每一个程序都对应一个application单例,每一个application都对应一个Appdelegate代理,在代理中控制程序的各个状态.我们在程序中获取Applicatio ...
- Swift中编写单例的正确方式
在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- asp.net mvc视图中使用entitySet类型数据时提示出错
asp.net mvc5视图中使用entitySet类型数据时提示以下错误 检查了一下引用,发现已经引用了System.Data.Linq了,可是还是一直提示出错, 后来发现还需要在Views文件夹下 ...
随机推荐
- 【手机端判断】PC_to_M自写
var current_url = window.location.href; var replace_url = [ ['笔试简章','http://beijing.ysedu.com/zt/bjt ...
- PL/SQL链接Oracle出现乱码
1.用Pl/sql时,中文注释是乱码,需要查看下oracle server端的字符集. SQL语句:select userenv('language') from dual 结果:SIMPLIFIED ...
- todolist---插入和删除----vue
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HTTP知识点【总结篇】
1.什么是HTTP协议? 客户端和服务器之间数据传输的格式规范.全拼:HyperText Transfer Protocol:超文本传输协议. 2.http协议是无状态协议?怎么解决无状态协议? 无状 ...
- springboot无法加载oracle驱动终极解决
.ctrl+shirt+s .找到 Maven: com.oracle:ojdbc6: .找到classes 下的路径C:\Users\Administrator\.m2\repository\com ...
- Maximum Width Ramp LT962
Given an array A of integers, a ramp is a tuple (i, j) for which i < j and A[i] <= A[j]. The ...
- P2146 [NOI2015]软件包管理器
题目链接:https://www.luogu.org/problemnew/show/P2146 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安 ...
- python networkx:绘制网络图
1.简单使用 import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() G.add_edge(1,2) nx.draw_ ...
- 接口约束的另一种方法:Class类的isAssignableFrom
Class类的isAssignableFrom是个不常用的方法,感觉这个方法的名字取得不是很好,所以有必要在此解析一下,以免在看源码时产生歧义,这个方法的签名如下: public native boo ...
- JavaScript 数组(Array)方法汇总
数组(Array)常用方法; 数组常用的方法:concat(),every(), filter(), forEach(), indexOf(), join(), lastIndexOf(), map ...