.Net 6.0定义全局当前身份缓存对象
背景:
当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当前身份缓存对象,当然啦今天的博客就是因为我们公司研发部门刚成立不久所以导致很多项目不完善,我在开发过程中就遇到了没有当前身份缓存对象的问题,开发极其不方便啊哈哈,所以我打算自己整一个,所以就有了今天的这篇文章,希望在对屏幕前的你也有所帮助!!
思路:
我们登录后一些必要的用户数据存到Token中,我们只需要在请求头中拿到Token并将它解析出来,再通过数据库查询出来即可,做的好一点可以配合上Redis,但是不用Redis也无伤大雅,当然也会遇到一些小问题,比如HttpContext对象如何获取,我在这里的解决方案是,定义一个静态类然后在请求管道中拿到服务容器,再通过服务容器拿到IHttpContextAccessor服务,再点出HttpContext,再拿到请求头,是不是很简单,那我们就直接步入正题吧!!!各位看官献丑了哈哈哈哈
正题:
1.创建静态类ServiceLocator获取服务容器:
在这里解释一下为什么不直接注入IHttpContextAccessor服务再通过构造函数获取,因为这过程中会有遇到一个问题,在静态类中是不能有构造函数的,如果是直接把这个服务容器拿过来就可以完美的解决这个问题,先不着急在下面会体现(第三和第四点)
1 public static class ServiceLocator
2 {
3 public static IApplicationBuilder? Builder;
4 }
2.在请求管道中赋值
1 var app = builder.Build();
2 ServiceLocator.Builder = app;
3.创建HttpContext类并通过IHttpContextAccessor服务获取HttpContext
1 /// <summary>
2 /// Http上下文对象
3 /// </summary>
4 public static HttpContext HttpContext => ServiceLocator.Builder!
5 .ApplicationServices
6 .GetRequiredService<IHttpContextAccessor>()
7 .HttpContext;
4.创建当前身份缓存对象帮助类并将Token中信息解析,并查询响应
1 public static class CurUserInfoHelper
2 {
3 /// <summary>
4 /// 当前身份缓存对象
5 /// </summary>
6 public static SysUserOutputWebDto? CurUserInfo => GetCurUserInfo();
7
8 /// <summary>
9 /// 获取当前用户身份缓存对象
10 /// </summary>
11 /// <returns></returns>
12 public static SysUserOutputWebDto GetCurUserInfo()
13 {
14 var result = new SysUserOutputWebDto();
15 var httpContext = HttpContextHelper.HttpContext;
16 var headrs = httpContext.Request.Headers;
17 var authorization = headrs["Authorization"];
18 string token = authorization!;
19 if (token.Contains("Bearer"))
20 {
21 string[] tokenStr = authorization.ToString().Split(' ');
22 token = tokenStr[1];
23 }
24 var claims = JwtHelper.GetTokenValue(token);
25 var userId = claims["UserID"];
26 if (!string.IsNullOrEmpty(userId))
27 {
28 //非构造函数式注入服务
29 var serviceScope = ServiceLocator.Builder!.ApplicationServices.CreateScope();
30 var sysUserEntityBL = serviceScope.ServiceProvider.GetService(typeof(ISysUserEntityBL)) as ISysUserEntityBL;
31
32 var sysUser = sysUserEntityBL!.GetSinge(d => d.Id == userId);
33 result = sysUser.AsOutputWebDto();//Entity转换为输出型Dto
34 }
35 return result;
36 }
37
38 }
4.直接使用即可
1 var curUser =CurUserInfoHelper.CurUserInfo;
效果如下图:

结尾:
今天的内容承接上篇Jwt加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻
.Net 6.0定义全局当前身份缓存对象的更多相关文章
- struts2异常处理,global-results定义全局结果处理
<global-results>定义全局结果处理 一般发生异常之后 结果返回errHandler 因为errHandler是由<global-exception-mappings&g ...
- vue 2.0 路由切换以及组件缓存源代码重点难点分析
摘要 关于vue 2.0源代码分析,已经有不少文档分析功能代码段比如watcher,history,vnode等,但没有一个是分析重点难点的,没有一个是分析大命题的,比如执行router.push之后 ...
- ThinkPHP5.0源码学习之缓存Cache(一)
一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...
- 微信小程序 如何定义全局函数?
微信小程序 定义全局数据.函数复用.模版等 微信小程序定义全局数据.函数复用.模版等问题总结: 1.如何定义全局数据 在app.js的App({})中定义的数据或函数都是全局的,在页面中可以通过var ...
- Object_C 定义全局宏的颜色时,报“Expected identifier”的错误
在定义全局颜色宏的时候,为了整齐把空格删了,写在了同一行里,调用的时候,出错提示“Expected identifier”,如下: 如果宏定义如上那样的话,在调用的时候,会出现如下的问题: 百思不得解 ...
- vue定义全局date过滤器(自定义JS文件模块和Moment.js库)
自定义dateFormat.js文件模块 dateFormat.js /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-0 ...
- TZ_16_Vue定义全局组件和局部组件
1.定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <co ...
- 在vue-cli项目中定义全局 filter、method 方法
1.创建 filters.js(methods.js) 文件: 2.filters.js(methos.js) 中定义全局过滤方法: 1 export default { 2 /** 时间戳转换 */ ...
- UNICODE 7.0定义的表情符
td.graph { font-size:24px; } UNICODE 7.0定义了78个表情符,从0x1F600到0x1F64F(其中0x1F643和0x1F644没有定义).下表中列出了这些表情 ...
- vue 定义全局函数,监听android返回键事件
vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...
随机推荐
- 迭代器简易用法Iterator
1 public static void main(String[] args) { 2 List<String> list = Arrays.asList("111" ...
- fiddler everywhere 抓包工具的使用
1.功能 手机微信或者浏览器访问网址都可以在fidder里面抓到http请求 2.配置 电脑fidder setting->允许安卓手机远程访问 安卓手机 设置->wifi代理 主机名是电 ...
- oracle函数及相关问题
show user 查看当前用户select * from tab: 查看当前数据库中的表desc 表名 : 查看表结构 between and 包含开头结尾 函数: months_between(a ...
- mysql之存储引擎-第二篇
什么是存储引擎? 数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建,查询,更新和删除数据操作.不同的存储引擎提供了不同的存储机制,索引技巧及特定功能. 存储引擎类型 InnoDB ...
- eclipse project is missing required java project
eclipse project is missing required java project eclipse版本: 2022-03 这情况就是maven包出了问题 具体的说不上 看我的解决方法: ...
- vue移动端购物商场首页制作
1.搭建项目框架 新建首页主组件及其子组件并将子组件展示出来 2.封装所需接口 3.编写轮播图组件 <template> <div id="swipercom"& ...
- 自学JavaDay01
1.Java的特性和优势 简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性 2.Java三大版本 JavaSE:标准版(桌面程序,控制台开发......) JavaME:嵌入 ...
- json for python学习笔记
1.json作用 存储数据与数据传输 2.python中的json可以在代码中用字符串表示,字符串内部类似于字典 如: json1 = '{"name":"Bob&quo ...
- Linux下 Jdk版本切换
安装: 甲骨文官网下jdk 上传到云服务器 解压: tar -zxvf jdk-7u79-linux-x64.tar.gz 设置环境变量 vim /etc/profile 末尾加上 export JA ...
- 多级路由,重定向之后,刷新页面报错问题:报错Unexpected token '<'
使用脚手架:vue-cli3.0vue版本:vue3.0vue-router版本:vue-router4.0 配置多级路由,首次访问,到重定向页面没有问题,然后在当前页面刷新控制台报错:Unexpec ...