Tomcat会话pipe理 – 在一台主机上独立会话

我有一个简单的tomcat上的jsp站点。 要使用会话,我使用简单的jsp session对象。

但我需要一些会话隔离在我的网站目录情商

 mysite.com/dir1 mysite.com/dir2 

我想为每个dir1dir2使用独立的会话

这是可能的最小的jsp代码更正,而不使用虚拟主机?

Tomcat通过sessionCookiePath 上下文参数控制会话cookie的path,但不足以满足您的需求。 我相信你可以用很less的代码在服务器(servlet容器)和浏览器中快速松动。

总之,写一个让请求进入的servletfilter,不变。 当响应出来时,将您的servletpath添加到JSESSIONID的cookiepath,并让浏览器为每个servlet发送不同的JSESSIONID(因此使用不同的会话)。

下面是它的工作原理 :

  1. 当请求第一次出现时,它是“裸”的,它没有任何与之关联的cookie。 它没有会话。
  2. 服务器将创build一个并将JSESSIONID关联到它,并添加一个cookie让客户端完成其跟踪的一部分。
  3. 客户仍然在等待最初的请求。
  4. 在servletfilter(或mod_rewrite)中添加servletpath到cookie的path。
  5. 将响应发送给客户端。

通过为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。