.net core中的Session以及HttpContext對象使用小結

session用於識別用戶並保持用戶信息,就是一個會話 ,在瀏覽器不關閉的前提下,能夠保存用戶的信息,好比登陸的保存用戶信息從一個網頁跳轉到另外一個網頁,你的用戶信息就能夠用session。web

.net core是一個高度組件化的框架,不少功能好比受權,認證,回話狀態等都是經過中間件的方式引入的,必須基於NuGet添加,或者基於project.json添加,而後保存VS會啓動還原類庫。json

一、添加Session

在你的項目上基於NuGet添加:Microsoft.AspNetCore.Session。通常咱們在創建core web項目時,程序已經添加了對session的支持。瀏覽器

二、添加Session配置服務

在startup.cs找到方法ConfigureServices(IServiceCollection services) 注入Session(這個地方是Asp.net Core pipeline):cookie

配置session超時時間60分鐘。session

services.AddSession(o =>
            {
                o.IdleTimeout = TimeSpan.FromSeconds(60 * 60);
            });

也能夠不指定時間:services.AddSession();app

三、啓用Session配置

session注入到了服務,咱們還要告訴Asp.net Core使用內存存儲Session數據    app.UseSession();框架

注意放置代碼的順序,Session必須在MVC以前。asp.net

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
            //用戶session服務
            app.UseSession();

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            //app.UseCookiePolicy();

            //建立路由
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Default",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" }
                );
            });
            app.UseMvc();
        }

 

在MVC Controller裏使用HttpContext.Sessionide

public class HomeController:Controller
{
   public IActionResult Index()
   {
       HttpContext.Session.SetString("code","123456");
       return View();
    }
 
    public IActionResult About()
    {
       ViewBag.Code=HttpContext.Session.GetString("code");
       return View();
    }
}

 

二、若是不是在Controller裏,你能夠注入IHttpContextAccessor,有兩種方式,一種是在類的構造函數裏面注入,以下:函數

public class SomeOtherClass
{
   private readonly IHttpContextAccessor _httpContextAccessor;
   private ISession _session=> _httpContextAccessor.HttpContext.Session;
 
   public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
   {
      _httpContextAccessor=httpContextAccessor;      
   }
 
   public void Set()
   {
     _session.SetString("code","123456");
   }
   
   public void Get()
  {
     string code = _session.GetString("code");
   }
}

 

三、另一種是經過IServiceProvider,這時須要在startup中Configure中獲得這個對象,而後經過

Microsoft.AspNetCore.Http.IHttpContextAccessor factory = app.ApplicationServices.GetService<Microsoft.AspNetCore.Http.IHttpContextAccessor>();
Microsoft.AspNetCore.Http.HttpContext context = factory.HttpContext;

 

或者

Microsoft.AspNetCore.Http.IHttpContextAccessor factory = app.ApplicationServices.GetService(typeof(Microsoft.AspNetCore.Http.IHttpContextAccessor));
Microsoft.AspNetCore.Http.HttpContext context = factory.HttpContext;

 

獲得Microsoft.AspNetCore.Http.HttpContext對象,這時就能夠和使用HttpContext了,裏面有Session,Request,Response對象的使用,在使用Request對象時,這樣獲取HttpContext.Request.Query[""]請求參數,獲取cookie經過HttpContext.Request.Cookies[""],這裏有一點須要注意netcore中的cookie添加的是經過HttpContext.Response.Cookies.Append方法添加的,和asp.net 不一樣的是添加的鍵值對的值是自動UrlEncode的,因此獲取cookie的時候是UrlDecode的,這個須要注意。

原文:https://www.jianshu.com/p/0315aa029867
相關文章
相關標籤/搜索