首页 > 其他分享 >.Net 6.0定义全局当前身份缓存对象

.Net 6.0定义全局当前身份缓存对象

时间:2023-03-24 17:01:05浏览次数:43  
标签:缓存 对象 public static 6.0 var Net HttpContext

背景:

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

思路:

  我们登录后一些必要的用户数据存到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加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻

标签:缓存,对象,public,static,6.0,var,Net,HttpContext
From: https://www.cnblogs.com/shenweif/p/17252674.html

相关文章

  • strokeplug.net - vscode
    functiongetWindowByProcessName(pName){if(!pName||pName.lenght<1)return;letwnds=sp.AllApplications();letresult=newArray();for......
  • 分布式缓存服务DCS | 企业版性能更强,稳定性更高
    背景介绍近年来,随着各行业业务需求急速增加,数据量和并发访问量呈指数级增长,原来只能依附于关系型数据库的传统“缓存”逐渐难以支撑上层业务,开源Redis也面临着如“容量有限......
  • vmware安装redhat 6.0初次启动网卡无法启动问题
    在使用vmware(目前在6.5和7.1.4版本上试过)安装redhatenterpriselinux6.0之后,第一使用网卡会遇到无法获取IP地址的情况,当运行“#servicenetworkrestart”之后,只能显示......
  • .Net MVC 实现WebSocket
    WebSocket 1.基于Html5,IIS8.0版本以上,前端代码和服务器都必须支持WebSocket才能使用;2.请求必须以WS:开头下面是后台接收前端websocket申请的方法:///<summary>......
  • QT中使用QNetworkAccessManager类进行POST数据//京鸿通信科技(深圳)有限公司//155075891
    QT中使用QNetworkAccessManager类进行POST数据QNetworkAccessManager类简介:1QNetworkAccessManager类允许应用程序发送网络请求和接收网络应答。NetworkAccessAPI都......
  • 使用C#&.NET Core编程实现获取所有Windows服务列表及对Windows服务(Windows Service)
    使用C#&.NETCore编程实现获取所有Windows服务列表及对Windows服务(WindowsService)的启动/停止/重启的方法原文链接:https://codedefault.com/p/start-stop-restart-inst......
  • 在aspnetcore中实现AOP的方式
    aaspnetcore开发框架中实现aop不仅仅在业务上,在代码的优雅简洁和架构的稳定上都有着至关重要。下面介绍三种用过的。 第一种使用DispatchProxy实现通过使用System.Re......
  • linux 命令使用9--netstat(网络)
    1.概述netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。2.语法netstat[-acCeFghilMnNoprstuvV......
  • aspnetcore中aop的实现
    aaspnetcore开发框架中实现aop不仅仅在业务上,在代码的优雅简洁和架构的稳定上都有着至关重要。下面介绍三种用过的。 第一种通过System.Reflection的DispatchProxy类来......
  • .NET生成MongoDB中的主键ObjectId
    前言因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中Ob......