关于当前登陆人的确认,Session的运用

在程序的各项操作中,常常需要获取当前登陆人,例如在做日志保存等操作的时候,以下是解决思路

拦截器会处理各个接口请求,请求里token记录着当前用户信息,我们解析后将token存入Session中,确认了当前操作人。当我们在做日志处理的时候,只需要取出session存的用户信息就可以了

以下是对Session的应用,先写个SessionHelper帮助类

public class SessionHelper
    {
        public static HttpContext _httpContext;

        public static ISession _session => _httpContext.Session;

        /// <summary>
        /// session写入
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public static void Set(string key, string value)
        {
            _session.SetString(key, value);
        }

        /// <summary>
        /// session的读取
        /// </summary>
        /// <param name="key"></param>
        public static string Get(string key)
        {
            return _session.GetString(key);
        }
    }

写好帮助类,我们直接在拦截器里运用,保存解析出的用户信息

 public Task Invoke(HttpContext httpContext)

        {
            //检测是否包含'Authorization'请求头,如果不包含则直接放行
            //登陆放行,预加载放行,文件上传放行
            if (httpContext.Request.Path.Value.Equals("/api/Login/Login") || httpContext.Request.Method == "OPTIONS")
            {

                return _next(httpContext);
            }
            else if (httpContext.Request.Headers.ContainsKey("Authorization"))
            {
                var tokenHeader = httpContext.Request.Headers["Authorization"];


                TokenModel tm = JwtHelper.SerializeJWT(tokenHeader);

                SessionHelper.Set("LoginName", tm.LoginName);//存入用户名
                SessionHelper.Set("UserId", tm.Uid);//存入用户ID
              
                return _next(httpContext);
            }
            return null;
        }

这样用户名和id就存入了Session中,我们去调用一下

 这个时候请求为空,这是容易忽略的错误,拦截器里面http请求并没有传入SessionHelper,我们少了一个步骤

再运行

还是报错,还忽略了一个步骤,Session需要在startup文件中进行注册

配置好后,我们在控制器里取得了Session,该Session只能在控制器里用,如果换到服务层失效,,如果在其他层使用,需要使用 IHttpContextAccessor

猜你喜欢

转载自www.cnblogs.com/wangcongsuibi/p/10370801.html