servlet在同一域下jsession冲突问题现象记录之二

重新想了想 http://nonesuccess.me/?p=363 中的现象,梳理一下思路,解决一些上次没解释请的问题。

我最初的想法类似于朴素的字符串前缀规则,端口是比域次一级的概念,但是比path高一级,因为排在前面……根据经验,同端口是存在cookie共享的,所以path也一定存在。

经过上次的测试,这个结论是错误的。同域下的同个webapp共享cookie,涉及到不同端口时,就是同名webapp共享cookie。但是不同名的webapp不会共享。

但是仔细分析一下,道理上还是讲不通。webapp是服务端servlet下的概念,浏览器并不知道服务端的架构,因此用webapp是否是一个或者是否同名,显然不是这个现象的根本原因。

查了查servlet设置cookie的apihttps://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html,又查了查cookie的rfchttps://tools.ietf.org/html/rfc6265,发现cookie大致有这么几个属性:

  • domain:域
  • path:cookie适用的路径
  • maxAge:有效期
  • ……

浏览器能知道的只有domain和path,所以servlet是通过设置不同的path的手段,去控制在不同webapp之间,是否共享cookie。至于上面那些现象,只是这些手段推断出来的必然结果。

==假装分割线==

人总是不能避免将精力放在把“同名webapp共享,不同名的webapp不共享”当作结论背下来上。找到root cause不是一句简单的口号,在实践中更多的问题在于无法合理的划分做到哪一步才算是root cause,从而有了“反正也找不到根本原因,所以先背下来一个”的心态。

知止而后有定。

发表评论

电子邮件地址不会被公开。 必填项已用*标注