在程序的各项操作中,常常需要获取当前登陆人,例如在做日志保存等操作的时候,以下是解决思路
拦截器会处理各个接口请求,请求里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