HttpCookie 路径是否区分大小写?
Is HttpCookie path case sensitive?
这是 C# ASP.NET MVC 5 网络应用程序,使用 .NET Framework 4.6.1。
System.Web.HttpCookie
有一个 Path
属性,即“与 cookie 一起传输的虚拟路径”。默认值“/”表示服务器根目录。
该路径区分大小写吗?我认为它应该是 不区分大小写,因为 URL 的路径部分是不区分大小写的。 [更新:我的这个假设是错误的。请在下面查看答案。] 然而,我的经验证明情况并非如此。
获取 cookie
Web 应用程序有一个 FooBarController
,它有一个 index()
方法,我可以在其中获取 cookie 的值,然后呈现视图。
using System.Web;
using System.Web.Mvc;
public class FooBarController : Controller
{
public ActionResult index( )
{
HttpCookie cookie = HttpContext.Request.Cookies.Get( "page_length" );
if ( cookie != null )
{
// Do something with the page length provided by cookie.Value.
...
}
...
return View( somedata );
}
...
以下是该控制器方法的路由。请注意,在路由中使用“foobar”或“FooBar”并不重要。我都试过了。
public class RouteConfig
{
public static void RegisterRoutes( RouteCollection routes )
{
routes.MapRoute( "", "foobar/index", defaults: new { controller = "foobar", action = "index" } );
routes.MapRoute( "", "foobar/load", defaults: new { controller = "foobar", action = "load", HttpVerbs = HttpVerbs.Post } );
}
}
存储 cookie
在该控制器的另一种方法中,我将值存储在 cookie 中。假定以下 load()
方法在 Web 应用程序的生命周期内被正确调用,并且 cookie 被正确存储在客户端浏览器中。
public JsonResult load( TableData data )
{
HttpCookie cookie = new HttpCookie( "page_length" );
cookie.Value = data.PageLength.ToString();
// *** This is the important part. ***
cookie.Path = "/FooBar";
cookie.Expires = DateTime.Now.AddDays( 30 );
HttpContext.Response.Cookies.Add( cookie );
...
}
测试 1:区分大小写的路径:有效
如前所述,cookie已成功存储在客户端浏览器中。
我启动网络应用程序,然后导航到以下 URL。观察 URL 包含大小写混合的“FooBar”,即使它不一定要到达所需的页面。
- /localhost:12345/FooBar
在FooBarController.index()
中,我可以成功获取cookie并使用它的值。
测试 2:不区分大小写的路径:不起作用
cookie 仍然成功存储在客户端浏览器中。
我启动了网络应用程序,但导航到以下 URL。观察 URL 包含一个小写的“foobar”,这足以到达所需的页面。
- /localhost:12345/foobar
在FooBarController.index()
中,我无法获取cookie。该 cookie 对该方法是隐藏的,大概是因为它仅与“/FooBar”的混合大小写路径相关联。
测试 3:缓解
使用“/foobar”的小写路径存储cookie。
public JsonResult load( TableData data )
{
HttpCookie cookie = new HttpCookie( "page_length" );
cookie.Value = data.PageLength.ToString();
// *** This is the important part. ***
cookie.Path = "/foobar";
...
我启动网络应用程序,然后导航到以下 URL,与测试 2 相同。
- /localhost:12345/foobar
在FooBarController.index()
中,我可以成功获取cookie并使用它的值。
为什么?
为什么 cookie 的路径必须与正在导航的页面的 URL 的路径部分大小写相同?
是的,HttpCookie 的路径区分大小写。
正如评论中所指出的,我假设 URL 的路径部分不区分大小写是错误的。因此,cookie中存储的路径应该区分大小写是合理的。
C# ASP.NET Web 应用程序的路由配置更为宽容。调用 RouteCollection.MapRoute()
时,提供的 URL 模式可能与用于导航的实际 URL 的大小写不同。提供给 MapRoute()
的控制器和操作名称也可以与实际控制器 class 名称和方法名称的大小写不同。因此,我被误导了。
https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-components-url 说:
The scheme and host components of a URL are not defined as case-sensitive, but the path and query string are case-sensitive. Typically, the whole URL is specified in lowercase.
我发现的大多数其他 URL 文档可能会明确说明其他部分(例如方案和主机)不区分大小写。而且由于它没有说明路径部分的大小写,我应该推断它是区分大小写的。
这是 C# ASP.NET MVC 5 网络应用程序,使用 .NET Framework 4.6.1。
System.Web.HttpCookie
有一个 Path
属性,即“与 cookie 一起传输的虚拟路径”。默认值“/”表示服务器根目录。
该路径区分大小写吗?我认为它应该是 不区分大小写,因为 URL 的路径部分是不区分大小写的。 [更新:我的这个假设是错误的。请在下面查看答案。] 然而,我的经验证明情况并非如此。
获取 cookie
Web 应用程序有一个 FooBarController
,它有一个 index()
方法,我可以在其中获取 cookie 的值,然后呈现视图。
using System.Web;
using System.Web.Mvc;
public class FooBarController : Controller
{
public ActionResult index( )
{
HttpCookie cookie = HttpContext.Request.Cookies.Get( "page_length" );
if ( cookie != null )
{
// Do something with the page length provided by cookie.Value.
...
}
...
return View( somedata );
}
...
以下是该控制器方法的路由。请注意,在路由中使用“foobar”或“FooBar”并不重要。我都试过了。
public class RouteConfig
{
public static void RegisterRoutes( RouteCollection routes )
{
routes.MapRoute( "", "foobar/index", defaults: new { controller = "foobar", action = "index" } );
routes.MapRoute( "", "foobar/load", defaults: new { controller = "foobar", action = "load", HttpVerbs = HttpVerbs.Post } );
}
}
存储 cookie
在该控制器的另一种方法中,我将值存储在 cookie 中。假定以下 load()
方法在 Web 应用程序的生命周期内被正确调用,并且 cookie 被正确存储在客户端浏览器中。
public JsonResult load( TableData data )
{
HttpCookie cookie = new HttpCookie( "page_length" );
cookie.Value = data.PageLength.ToString();
// *** This is the important part. ***
cookie.Path = "/FooBar";
cookie.Expires = DateTime.Now.AddDays( 30 );
HttpContext.Response.Cookies.Add( cookie );
...
}
测试 1:区分大小写的路径:有效
如前所述,cookie已成功存储在客户端浏览器中。
我启动网络应用程序,然后导航到以下 URL。观察 URL 包含大小写混合的“FooBar”,即使它不一定要到达所需的页面。
- /localhost:12345/FooBar
在FooBarController.index()
中,我可以成功获取cookie并使用它的值。
测试 2:不区分大小写的路径:不起作用
cookie 仍然成功存储在客户端浏览器中。
我启动了网络应用程序,但导航到以下 URL。观察 URL 包含一个小写的“foobar”,这足以到达所需的页面。
- /localhost:12345/foobar
在FooBarController.index()
中,我无法获取cookie。该 cookie 对该方法是隐藏的,大概是因为它仅与“/FooBar”的混合大小写路径相关联。
测试 3:缓解
使用“/foobar”的小写路径存储cookie。
public JsonResult load( TableData data )
{
HttpCookie cookie = new HttpCookie( "page_length" );
cookie.Value = data.PageLength.ToString();
// *** This is the important part. ***
cookie.Path = "/foobar";
...
我启动网络应用程序,然后导航到以下 URL,与测试 2 相同。
- /localhost:12345/foobar
在FooBarController.index()
中,我可以成功获取cookie并使用它的值。
为什么?
为什么 cookie 的路径必须与正在导航的页面的 URL 的路径部分大小写相同?
是的,HttpCookie 的路径区分大小写。
正如评论中所指出的,我假设 URL 的路径部分不区分大小写是错误的。因此,cookie中存储的路径应该区分大小写是合理的。
C# ASP.NET Web 应用程序的路由配置更为宽容。调用 RouteCollection.MapRoute()
时,提供的 URL 模式可能与用于导航的实际 URL 的大小写不同。提供给 MapRoute()
的控制器和操作名称也可以与实际控制器 class 名称和方法名称的大小写不同。因此,我被误导了。
https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-components-url 说:
The scheme and host components of a URL are not defined as case-sensitive, but the path and query string are case-sensitive. Typically, the whole URL is specified in lowercase.
我发现的大多数其他 URL 文档可能会明确说明其他部分(例如方案和主机)不区分大小写。而且由于它没有说明路径部分的大小写,我应该推断它是区分大小写的。