我在 tomcat 上有一个简单的 jsp 站点。为了使用会话,我使用了简单的 jspsession
对象。
但是我需要在我的网络目录中进行一些会话隔离
mysite.com/dir1
mysite.com/dir2
我想为每个会话使用独立的dir1
会话dir2
只需最少的 jsp 代码修正并且不使用虚拟主机就可以吗?
答案1
Tomcat 提供了对会话 cookie 路径的一些控制,方法是sessionCookiePath 上下文参数,但还不足以满足您的需求。我相信您可以用很少的代码轻松随意地使用服务器(servlet 容器)和浏览器。
简而言之,编写一个 servlet 过滤器,让请求不加改变地进入。当响应出来时,将您的 servlet 路径添加到 JSESSIONID cookie 路径,并让浏览器为每个 servlet 发送不同的 JSESSIONID(从而使用不同的会话)。
下面是它的工作原理 :
- 当请求第一次到达时,它是“裸”的,没有任何与之关联的 cookie。它没有会话。
- 服务器将创建一个并将
JSESSIONID
其与它关联,并添加一个 cookie 以让客户端完成其跟踪部分。 - 此时客户端仍在等待其初始请求。
- 在 servlet 过滤器(或 mod_rewrite)中将 servlet 路径添加到 cookie 的路径。
- 将响应发送给客户端。
使用为 servlet 个性化的 cookie /dir1
,当浏览器向 发送请求时/dir2
,它也将是“裸露的”,没有任何 cookie。将创建一个新的会话,过滤器将向其添加路径,依此类推...
从服务器的角度来看,有两个客户端(具有相同的 IP)。一个始终使用/dir1
servlet,另一个仅使用/dir2
servlet。这没什么不对。
这是一个过滤器实现可以带来先机. 你也可以考虑在 Apache 中使用 mod_headers 进行操作。
答案2
问题是你为什么要这么做。
如果与安全有关,则应将 dir1 和 dir2 部署为不同的 servlet。不同的 servlet 具有不同的会话,因此您的问题应该可以解决。
如果这不是一个选项,并且您的动机与安全性无关,您可以为会话中的每个路径添加一个映射。然后,您必须首先通过获取路径的映射来访问会话对象,然后访问会话对象(即 ${session.dir1.foo})。
第三种解决方案可能是使用过滤器通过创建 HttpServletRequestWrapper(为不同的请求返回特殊的 HttpSession)来隐藏当前请求会话中的某些元素。