HttpSession 对象是否可用于在同一 Java 企业应用服务器中运行的所有应用程序?
对于我的工作,我有进行身份验证的登录应用程序,然后将其转发到另一个应用程序。在第二个应用程序中,添加了过滤器以防止直接访问 URL
ServletContext - 仅获取当前 web 应用程序的上下文。
处理这种情况的正确方法是什么?
HttpSession 对象是否可用于在同一 Java 企业应用服务器中运行的所有应用程序?
对于我的工作,我有进行身份验证的登录应用程序,然后将其转发到另一个应用程序。在第二个应用程序中,添加了过滤器以防止直接访问 URL
ServletContext - 仅获取当前 web 应用程序的上下文。
处理这种情况的正确方法是什么?
HttpSession 对象的范围是应用程序(或 servlet 上下文)级别。
Java™ Servlet 规范的摘录:
HttpSession 对象的范围必须在应用程序(或 servlet 上下文)级别。底层机制,例如用于建立会话的 cookie,对于不同的上下文可以是相同的,但引用的对象,包括该对象中的属性,决不能由容器在上下文之间共享。
用一个例子来说明这个要求:如果一个 servlet 使用 RequestDispatcher 调用另一个 Web 应用程序中的一个 servlet,那么为被调用的 servlet 创建并且对它可见的任何会话都必须不同于对调用 servlet 可见的会话。
处理这种情况的方法:
您可以使用servletContext.getContext("/otherWebappContext")方法从另一个 servlet 上下文访问可用的资源,如下所示:
request.setAttribute("userToken", <token>);
RequestDispatcher requestDispatcher = getServletContext().getContext(
"/otherWebappContext").getRequestDispatcher("/resource");
requestDispatcher.forward(request, response);
但是为被调用的 servlet 创建的任何会话都不同于调用 servlet 的会话。一旦请求被转发到第二个应用程序,它就可以使用通过请求属性接收到的数据创建一个新会话。
但出于安全原因,servlet 容器通常会阻止这些跨上下文操作。因此,您需要更改默认行为。例如,在 Tomcat 6 中,您需要将<Context>
TOMCAT_HOME/conf/context.xml 文件中的元素的 crossContext 属性设置为“true”,如下所示:
<?xml version='1.0' encoding='utf-8'?>
<Context crossContext="true">
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
没有 HttpSession 对象不适用于同一服务器中的所有应用程序。验证,
创建 2 个应用,在一个应用中使用 seesion.setAttribute("hello","hello"); 现在运行第二个应用程序
if(session.getAttribute("hello")==null)
{
//some codes to check
}
else
{
//some codes to check
}
您将看到是否将执行部分
没有 HttpSession 对象不在应用程序之间共享。在容器中的不同应用程序之间共享信息的标准方法是使用 ServletContext。ServletContext 的唯一限制是,如果 Web 应用程序分布在多个 JVM 之间,这将不起作用,因为上下文信息位于一个 JVM 中。