zoukankan      html  css  js  c++  java
  • WebApi2官网学习记录---Cookie

    Cookie的几个参数:
    Domain、Path、Expires、Max-Age

    如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cookie

    WebAPI中使用Cookie

    //写cookie
    public HttpResponseMessage Get()
    {
        var resp = new HttpResponseMessage();
    
        var cookie = new CookieHeaderValue("session-id", "12345");
        cookie.Expires = DateTimeOffset.Now.AddDays(1);
        cookie.Domain = Request.RequestUri.Host;
        cookie.Path = "/";
    
        resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
        return resp;
    }
    
    //获取cookie
    string sessionId = "";
    
    CookieHeaderValue cookie = Request.Headers.GetCookies("session-id").FirstOrDefault();
    if (cookie != null)
    {
        sessionId = cookie["session-id"].Value;
    }
    

    由于浏览器对cookie有一些限制,在单个cookie中存储结构化的数据是一个不错的选择,而不用设置多个cookie。

    ar resp = new HttpResponseMessage();
    
    var nv = new NameValueCollection();
    nv["sid"] = "12345";
    nv["token"] = "abcdef";
    nv["theme"] = "dark blue";
    var cookie = new CookieHeaderValue("session", nv); 
    
    resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    

    结果:

     Set-Cookie: session=sid=12345&token=abcdef&theme=dark+blue;
    

    从cookie中读取结构化的数据

    string sessionId = "";
    string sessionToken = "";
    string theme = "";
    
    CookieHeaderValue cookie = Request.Headers.GetCookies("session").FirstOrDefault();
    if (cookie != null)
    {
        CookieState cookieState = cookie["session"];
    
        sessionId = cookieState["sid"];
        sessionToken = cookieState["token"];
        theme = cookieState["theme"];
    }
    

    在Message Handler中可以对cookie进行处理

    一个Demo:

    using System;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web.Http;
    
    public class SessionIdHandler : DelegatingHandler
    {
        static public string SessionIdToken = "session-id";
    
        async protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            string sessionId;
    
            // Try to get the session ID from the request; otherwise create a new ID.
            var cookie = request.Headers.GetCookies(SessionIdToken).FirstOrDefault();
            if (cookie == null)
            {
                sessionId = Guid.NewGuid().ToString();
            }
            else 
            {
                sessionId = cookie[SessionIdToken].Value;
                try
                {
                    Guid guid = Guid.Parse(sessionId);
                }
                catch (FormatException)
                {
                    // Bad session ID. Create a new one.
                    sessionId = Guid.NewGuid().ToString();
                }
            }
    
            // Store the session ID in the request property bag.
            request.Properties[SessionIdToken] = sessionId;
    
            // Continue processing the HTTP request.
            HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
    
            // Set the session ID as a cookie in the response message.
            response.Headers.AddCookies(new CookieHeaderValue[] {
                new CookieHeaderValue(SessionIdToken, sessionId) 
            });
    
            return response;
        }
    }
    
    public HttpResponseMessage Get()
    {
        string sessionId = Request.Properties[SessionIdHandler.SessionIdToken] as string;
    
        return new HttpResponseMessage()
        {
            Content = new StringContent("Your session ID = " + sessionId)
        };
    }
  • 相关阅读:
    1. 二分查找
    Filezilla使用
    正则表达式regex
    TCP的三次握手和四次挥手
    Pycharm 更换源
    寒假学习进度(十四)
    寒假学习进度(十)
    寒假学习进度(九)
    寒假学习进度(八)
    寒假学习进度(七)
  • 原文地址:https://www.cnblogs.com/goodlucklzq/p/4481956.html
Copyright © 2011-2022 走看看