在ASP.NET Core中添加的Cookie若是含有特殊字符,会被自动转义

咱们知道在Cookie中有些字符是特殊字符,这些字符是不能出如今Cookie的键值中的。javascript

好比"="是Cookie中用来分隔键和值的特殊字符,例如:Key01=Value01,表示的是一个Cookie键值对,用"="分隔键和值。html

好比";"是Cookie中用来分隔多个Cookie键值的特殊字符,例如:Key01=Value01;Key02=Value02,表示的是两个Cookie键值对,用";"分隔两个Cookie键值。java

 

那么若是咱们在ASP.NET Core中,将这些特殊字符写入Cookie的键值中,会不会发生错误呢?jquery

为此咱们来作一个实验,首先咱们建立一个ASP.NET Core MVC 3.0项目:AspNetCoreCookieTestweb

在这个项目的HomeController中,咱们建立了四个Action方法:浏览器

  • Index,用于对cookie进行添加、删除、显示
  • AddCookie,添加cookie
  • RemoveCookie,删除添加的cookie
  • ShowCookieInAspNetCore,从ASP.NET Core代码中获取添加的cookie,并在视图页面中显示获取到的cookie值

HomeController的代码以下所示:cookie

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace AspNetCoreCookieTest.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// Index视图,用于对cookie进行添加、删除、显示
        /// </summary>
        public IActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 添加cookie
        /// </summary>
        public IActionResult AddCookie()
        {
            //添加两个cookie:"Key01=&;键01"和"Key02=&;键02",这两个cookie的key和value中都包含cookie特殊字符(诸如=&;等)
            Response.Cookies.Append("Key01=&;键01", "ABC=DEFG&H值01IJK;MLN");
            Response.Cookies.Append("Key02=&;键02", "ABC\"EF值02G+123");

            return View("Index");
        }

        /// <summary>
        /// 删除添加的cookie
        /// </summary>
        public IActionResult RemoveCookie()
        {
            Response.Cookies.Delete("Key01=&;键01");
            Response.Cookies.Delete("Key02=&;键02");

            return View("Index");
        }

        /// <summary>
        /// 从ASP.NET Core代码中获取添加的cookie,并在视图页面中显示获取到的cookie值
        /// </summary>
        public IActionResult ShowCookieInAspNetCore()
        {
            string Key01 = Request.Cookies["Key01=&;键01"];
            string Key02 = Request.Cookies["Key02=&;键02"];

            if (Key01 == null)
            {
                Key01 = string.Empty;
            }

            if (Key02 == null)
            {
                Key02 = string.Empty;
            }

            this.ViewData["Key01"] = string.Format("Cookie Key01=&;键01 value is {0}", Key01);
            this.ViewData["Key02"] = string.Format("Cookie Key02=&;键02 value is {0}", Key02);

            return View();
        }
    }
}

能够看到,咱们在AddCookie方法中,添加了两个Cookie键值对,而且咱们在Cookie的键和值中都加入了特殊字符,诸如"="、"&"、";"等。而后咱们稍后会用ShowCookieInAspNetCore方法在ASP.NET Core代码中获取添加的这两个Cookie键值对,并在视图页面上进行显示。测试

 

接下来咱们来看看Index.cshtml视图页面的代码:this

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.js" ></script>
    <script type="text/javascript">

        $(function () {
            //添加cookie
            $("#btnAddCookie").click(function () {
                window.location = "@Url.Action("AddCookie")";
            });

            //在web浏览器中,采用JavaScript显示添加的cookie
            $("#btnShowCookie").click(function () {
                alert(document.cookie);
            });

            //删除添加的cookie
            $("#btnRemoveCookie").click(function () {
                window.location = "@Url.Action("RemoveCookie")";
            });

            //从ASP.NET Core代码中获取添加的cookie,并在视图页面中显示获取到的cookie值
            $("#btnShowAspNetCoreCookie").click(function () {
                window.location = "@Url.Action("ShowCookieInAspNetCore")";
            });
        });

    </script>
</head>
<body>
    <div>
        <button id="btnAddCookie">添加Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnShowCookie">用JavaScript显示Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnRemoveCookie">删除Cookie</button>
    </div>
    <div style="margin-top:10px;">
        <button id="btnShowAspNetCoreCookie">在ASP.NET Core中显示Cookie</button>
    </div>
</body>
</html>

咱们在这个视图中,定义了四个按钮:编码

  • btnAddCookie,添加Cookie
  • btnShowCookie,用JavaScript显示Cookie
  • btnRemoveCookie,删除Cookie
  • btnShowAspNetCoreCookie,在ASP.NET Core中显示Cookie

 

如今咱们就来进行测试,执行项目,而后在web浏览器中访问HomeController的Index方法,在显示的视图页面中咱们先点击添加Cookie按钮:

这时ASP.NET Core执行了HomeController的AddCookie方法,因此咱们已经添加了两个Cookie键值对。

 

接下来咱们在页面上点击用JavaScript显示Cookie按钮,这时咱们能够看到尽管咱们添加的Cookie中键和值都包含特殊字符,可是实际上ASP.NET Core将Cookie键和值中的特殊字符都转义了,进行了Url编码,因此咱们在web浏览器中使用JavaScript显示Cookie键值时,获得的是进行Url编码后的Cookie键值:

因此两个Cookie键值对并无由于特殊字符而被错误地存储到web浏览器中,键和值中全部的特殊字符都采用Url编码进行了转义。

 

接下来,咱们在页面上点击在ASP.NET Core中显示Cookie按钮,看看再从ASP.NET Core代码中将这两个Cookie键值对读出来会是什么结果:

这个按钮会触发HomeController的ShowCookieInAspNetCore方法,而后显示ShowCookieInAspNetCore.cshtml视图页面,这个视图页面的代码以下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ShowCookieInAspNetCore</title>
</head>
<body>
    <div>
        @ViewData["Key01"].ToString()
    </div>
    <div style="margin-top:10px;">
        @ViewData["Key02"].ToString()
    </div>
    <div style="margin-top:10px;">
        <a href="@Url.Action("Index")">返回Index视图页面</a>
    </div>
</body>
</html>

这个视图页面其实就是将ASP.NET Core代码获取到的两个Cookie的值显示出来。

该视图页面执行结果以下:

同时咱们在Visual Studio中添加断点,在调试模式下,监测到了HomeController的ShowCookieInAspNetCore方法中获取到的两个Cookie值:

能够看到无论是ShowCookieInAspNetCore.cshtml视图页面,仍是Visual Studio的调试模式,都显示ASP.NET Core代码获取到的两个Cookie键值对,都自动进行了Url解码,和前面咱们添加Cookie时的键和值彻底相同。

因此这说明当咱们在ASP.NET Core中存储Cookie键值到web浏览器时,ASP.NET Core代码会自动将Cookie键值中的特殊字符采用Url编码进行转义,而稍后咱们用ASP.NET Core代码读取Http请求中的Cookie键值时,ASP.NET Core代码又会自动将Cookie键值中的特殊字符采用Url解码进行还原。

因此在ASP.NET Core中将特殊字符存入Cookie键值对是没有问题的,只不过若是在客户端web浏览器中使用JavaScript获取Cookie时,获取到的将会是Url编码后的Cookie键和值。可是从ASP.NET Core代码的角度去读写Cookie键和值是彻底没有问题的,由于ASP.NET Core代码会对Cookie键和值中的特殊字符自动进行Url编码和Url解码。

 

下载本文ASP.NET Core MVC 3.0项目的源代码

相关文章
相关标签/搜索