我有一个简单的tomcat上的jsp站点。 要使用会话,我使用简单的jsp session对象。
但我需要一些会话隔离在我的网站目录情商
mysite.com/dir1 mysite.com/dir2
我想为每个dir1和dir2使用独立的会话
这是可能的最小的jsp代码更正,而不使用虚拟主机?
Tomcat通过sessionCookiePath 上下文参数控制会话cookie的path,但不足以满足您的需求。 我相信你可以用很less的代码在服务器(servlet容器)和浏览器中快速松动。
总之,写一个让请求进入的servletfilter,不变。 当响应出来时,将您的servletpath添加到JSESSIONID的cookiepath,并让浏览器为每个servlet发送不同的JSESSIONID(因此使用不同的会话)。
下面是它的工作原理 :
JSESSIONID关联到它,并添加一个cookie让客户端完成其跟踪的一部分。 通过为servlet /dir1个性化的cookie,当浏览器向/dir2发送请求时,它也将是“裸体”的,没有任何cookie。 一个新的会话将被创build,filter将添加它的path,等等…
从服务器的angular度来看,有两个客户端(具有相同的IP)。 一个总是使用/dir1 servlet,另一个只使用/dir2 servlet。 没有错。
这里有一个filter的实现,可以给一个开始 。 你也可以考虑在mod_headers中使用Apache 。
问题是为什么你想这样做。
如果与安全性有关,则应将dir1和dir2部署为不同的servlet。 不同的servlet有不同的会话,所以你的问题应该被解决。
如果这不是一种select,而且您的动机与安全无关,则可以为会话的每个path添加一个地图。 然后,您必须首先访问会话对象,方法是获取path的映射,然后访问会话对象(即$ {session.dir1.foo})。
第三个解决scheme可能是通过创build一个HttpServletRequestWrapper来为当前请求隐藏会话中的某些元素,从而为不同的请求返回一个特殊的HttpSession。