是HttpCookie路径大小写敏感?



这是一个c# ASP。.NET MVC 5 web应用程序,使用。NET Framework 4.6.1.

System.Web.HttpCookie具有Path属性,即"与cookie一起传输的虚拟路径"。默认值"/"表示服务器根目录。

该路径区分大小写吗?我认为应该是不区分大小写,因为URL的路径部分不区分大小写。[更新:我的假设是错误的。下面是视频答案。然而,我的经验却证明并非如此。

取饼干

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中。假定以下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:区分大小写的路径:Works

如前所述,cookie已成功存储在客户端浏览器中。

我启动web应用程序,并导航到以下URL。请注意,URL包含混合大小写"FooBar",即使它不是到达所需页面的必要条件。

  • /localhost: 12345/FooBar

FooBarController.index()中,我可以成功地获取cookie并使用它的值。

Test 2:不区分大小写的路径:Does not work

cookie仍然成功存储在客户端浏览器中。

我启动web应用程序,但导航到以下URL。注意,URL包含一个小写的"foobar",这足以到达所需的页面。

  • /localhost: 12345/foobar

FooBarController.index()中,I不能把饼干拿来。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";
...

启动web应用程序,并导航到以下URL,与测试2相同。

  • /localhost: 12345/foobar

FooBarController.index()中,我可以成功地获取cookie并使用它的值。

为什么?

为什么cookie的路径必须与正在导航的页面的URL的路径部分相同?

是,HttpCookie的路径是区分大小写的。

正如评论中指出的那样,我认为URL的路径部分不区分大小写的假设是错误的。因此,我们有理由期望cookie中存储的路径是区分大小写的。

c# ASP. net的路由配置。NET web应用程序更加宽容。在调用RouteCollection.MapRoute()时,所提供的URL模式可能与用于导航的实际URL不同。提供给MapRoute()的控制器名和动作名也可以与实际的控制器类名和方法名不同。因此,我被误导了。

https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-components-url表示:

URL的方案和主机组件不区分大小写,但路径和查询字符串区分大小写。一般来说,整个URL都是小写的。

我找到的大多数其他URL文档可能会特别说明其他部分(如scheme和host)不区分大小写。由于它没有说明路径部分的大小写,我应该推断它是区分大小写的。

最新更新