- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当前身份缓存对象,当然啦今天的博客就是因为我们公司研发部门刚成立不久所以导致很多项目不完善,我在开发过程中就遇到了没有当前身份缓存对象的问题,开发极其不方便啊哈哈,所以我打算自己整一个,所以就有了今天的这篇文章,希望在对屏幕前的你也有所帮助!.
我们登录后一些必要的用户数据存到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.创建Jwt帮助类,代码如下
1 public static class JwtHelper 2 { 3 /// <summary> 4 /// 解密Token成字典 5 /// </summary> 6 /// <returns></returns> 7 public static Dictionary< string , string > GetTokenValue( string token) 8 { 9 var st = new JwtSecurityTokenHandler().ReadJwtToken(token); 10 var claims = st.Claims.ToList(); 11 var res = new Dictionary< string , string > (); 12 claims.ForEach(d => 13 { 14 res.Add(d.Type, d.Value); 15 }); 16 return res; 17 } 18 19 }
5.创建当前身份缓存对象帮助类并将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 }
6.直接使用即可 。
1 var curUser =CurUserInfoHelper.CurUserInfo;
效果如下图
今天的内容承接上篇Jwt加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻 。
最后此篇关于.Net6.0定义全局当前身份缓存对象的文章就讲到这里了,如果你想了解更多关于.Net6.0定义全局当前身份缓存对象的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的应用程序中有一个 settings.php 页面,它使用 $GLOBALS 来存储网络应用程序中使用的配置。 例如,他是我使用的一个示例设置变量: $GLOBALS["new_login_page
我正在尝试编译我们在 OS 类上获得的简单操作系统代码。它在 Ubuntu 下运行良好,但我想在 OS X 上编译它。我得到的错误是: [compiling] arch/i386/arch/start
我知道distcp无法使用通配符。 但是,我将需要在更改的目录上安排distcp。 (即,仅在星期一等“星期五”目录中复制数据),还从指定目录下的所有项目中复制数据。 是否有某种设计模式可用于编写此类
是否可以在config.groovy中全局定义资源格式(json,xml)的优先级,而不是在每个Resource上指定?例如,不要在@Resource Annotation的参数中指定它,例如: @R
是否有一些简单的方法来获取大对象图的所有关联,而不必“左连接获取”所有关联?我不能只告诉 Hibernate 默认获取 eager 关联吗? 最佳答案 即使有可能有一个全局 lazy=false(谷歌
我正在尝试实现一个全局加载对话框...我想调用一些静态函数来显示对话框和一些静态函数来关闭它。与此同时,我正在主线程或子线程中做一些工作...... 我尝试了以下操作,但对话框没有更新...最后一次,
当我偶然发现 this question 时,我正在阅读更改占位符文本。 无论如何,我回去学习了占位符。一个 SO 的回答大致如下: Be careful when designing your pl
例如,如果我有这样的文字: "hello800 more text 1234 and 567" 它应该匹配 1234 和 567,而不是 800(因为它遵循 hello 的 o,这不是一个数字)。 这
我一直在尝试寻找一种无需使用 SMS 验证系统即可验证电话号码(Android 和 iPhone)的方法。原因纯粹是围绕成本。我想要一个免费的解决方案。 我可以安全地假设 Android 操作系统会向
解决此类问题的规范 C++ 设计模式是什么? 我有一些共享多个类的多线程服务器。我需要为大多数类提供各种运行时参数(例如服务器名称、日志记录级别)。 在下面的伪 C++ 代码中,我使用了一个日志记录类
这个问题在这里已经有了答案: Using global variables in a function (25 个答案) 关闭 9 年前。 我是 python 的新手,所以可能有一个简单的答案,但我
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Does C++ call destructors for global and class static
我正在尝试使用 Objective-C 中的 ArrayList 的等价物。我知道我必须使用 NSMutableArray。我想要一个字符串列表 (NSString)。关键是我的列表应该可以从我类(c
今天刚开始学习 Android 开发,我找不到任何关于如何定义 Helper 类或将全局加载的函数集合的信息,我会能够在我创建的任何 Activity 中使用它们。 我的计划是创建(至少目前)2 个几
为什么这段代码有效: var = 0 def func(num): print num var = 1 if num != 0: func(num-1) fun
$GLOBALS["items"] = array('one', 'two', 'three', 'four', 'five' ,'six', 'seven'); $alter = &$GLOBALS
我想知道如何实现一个可以在任何地方使用您自己的设置的全局记录器: 我目前有一个自定义记录器类: class customLogger(logging.Logger): ... 该类位于一个单独的
我需要使用 React 测试库和 Jest 在我的测试中模拟不同的窗口大小。 目前我必须在每个测试文件中包含这个beforeAll: import matchMediaPolyfill from 'm
每次我遇到单例模式或任何静态类(即(几乎)只有静态成员的类)的实现时,我想知道这是否实际上不是一种黑客行为,因此只是为了设计而严重滥用类和实例的原则单个对象,而不是设计类和创建单个实例。对我来说,看起
这个问题在这里已经有了答案: Help understanding global flag in perl (2 个回答) 7年前关闭。 my $test = "There was once an\n
我是一名优秀的程序员,十分优秀!