背景:

  当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当前身份缓存对象,当然啦今天的博客就是因为我们公司研发部门刚成立不久所以导致很多项目不完善,我在开发过程中就遇到了没有当前身份缓存对象的问题,开发极其不方便啊哈哈,所以我打算自己整一个,所以就有了今天的这篇文章,希望在对屏幕前的你也有所帮助!!

思路:

  我们登录后一些必要的用户数据存到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定义全局当前身份缓存对象的更多相关文章

  1. struts2异常处理,global-results定义全局结果处理

    <global-results>定义全局结果处理 一般发生异常之后 结果返回errHandler 因为errHandler是由<global-exception-mappings&g ...

  2. vue 2.0 路由切换以及组件缓存源代码重点难点分析

    摘要 关于vue 2.0源代码分析,已经有不少文档分析功能代码段比如watcher,history,vnode等,但没有一个是分析重点难点的,没有一个是分析大命题的,比如执行router.push之后 ...

  3. ThinkPHP5.0源码学习之缓存Cache(一)

    一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...

  4. 微信小程序 如何定义全局函数?

    微信小程序 定义全局数据.函数复用.模版等 微信小程序定义全局数据.函数复用.模版等问题总结: 1.如何定义全局数据 在app.js的App({})中定义的数据或函数都是全局的,在页面中可以通过var ...

  5. Object_C 定义全局宏的颜色时,报“Expected identifier”的错误

    在定义全局颜色宏的时候,为了整齐把空格删了,写在了同一行里,调用的时候,出错提示“Expected identifier”,如下: 如果宏定义如上那样的话,在调用的时候,会出现如下的问题: 百思不得解 ...

  6. vue定义全局date过滤器(自定义JS文件模块和Moment.js库)

    自定义dateFormat.js文件模块 dateFormat.js /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-0 ...

  7. TZ_16_Vue定义全局组件和局部组件

    1.定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <co ...

  8. 在vue-cli项目中定义全局 filter、method 方法

    1.创建 filters.js(methods.js) 文件: 2.filters.js(methos.js) 中定义全局过滤方法: 1 export default { 2 /** 时间戳转换 */ ...

  9. UNICODE 7.0定义的表情符

    td.graph { font-size:24px; } UNICODE 7.0定义了78个表情符,从0x1F600到0x1F64F(其中0x1F643和0x1F644没有定义).下表中列出了这些表情 ...

  10. vue 定义全局函数,监听android返回键事件

    vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...

随机推荐

  1. turtle 画照片

    # -*- coding: utf-8 -*- import turtle as t import cv2 def draw_img(img_path, scale=1): ""& ...

  2. Flutter showModalBottomSheet 自适应高度

    showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( borderRadius: BorderRad ...

  3. ansible使用笔记:长期更新

    ansible使用笔记 ##将/home/system.sh文件拷贝到所有服务器的/home/system.sh ansible all -m copy -a "src=/home/syst ...

  4. IDEA 2018.3.*本地启动tomcat项目无法设置Application context localhost 404

    记录一个开发中遇到的坑,网上找了好久才找到一个能解决的办法,特此转载一下. 旧版的idea启动web项目,在tomcat配置环节,有设置Application content的功能.我们可以设置成&q ...

  5. 11.25 es6

    ### 项目初始化 `npm init` `npm init -y` ### 安装项目依赖(包) `npm install` ### 安装 `npm install 包名 --save` `npm i ...

  6. Matlab|multcompare文档

    multcompare Syntax c = multcompare(stats) c = multcompare(stats,Name,Value) [c,m] = multcompare(___) ...

  7. 六、js创建页码器:分页、上一页下一页、省略页码

    表格数据太多,需要做成分页.因此需要写一个页码器. 1,初始化页码 获取数据之后渲染页码器,页码器初始化,小于6页的全部展示,否则展示前四页,后面是省略号,最后展示尾页.默认选中第一页,禁用前一页的箭 ...

  8. iview的表格 render

    view的表格   render 先看一下效果图   效果题 代码如下   render render:(h,params)=>{} //h指dom对象,params指当前每一行数据(param ...

  9. Crypto入门 (四)不仅仅是Morse(Morse+Bacon)

    前言: 前面我们刚刚学过了解Morsecode,现在我们将继续学习 不仅仅是Morse: 题目:--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--. ...

  10. idea设置springboot项目热部署

    转自: https://www.cnblogs.com/zhukf/p/12672180.html 一.什么是热部署? 热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用. 二.什么是Sp ...