Java Web 应用程序对象调度



HttpSession 对象是否可用于在同一 Java 企业应用程序服务器中运行的所有应用程序?

对于我的工作,我有登录应用程序进行身份验证,然后将其转发到另一个应用程序。在第二个应用程序中,添加了过滤器以防止直接访问 URL

ServletContext - 仅获取当前 Web 应用程序的上下文。

处理这种情况的正确方法是什么?

HttpSession 对象的范围限定在应用程序(或 servlet 上下文)级别。

摘自Java™ Servlet规范:

HttpSession 对象的作用域必须限定在应用程序(或 servlet) 上下文)级别。底层机制,例如用于 建立会话,对于不同的上下文可以相同,但是 引用的对象(包括该对象中的属性)不得 由容器在上下文之间共享。

为了用一个例子来说明这个要求:如果一个 servlet 使用 RequestDispatcher 在另一个 Web 应用程序中调用 Servlet,任何 为被调用的 servlet 创建且可见的会话必须是 与调用 servlet 可见的那些不同。

处理此方案的方法:

您可以使用servletContext.getContext("/otherWebappContext")方法从另一个servlet上下文访问可用于另一个servlet上下文的资源,如下所示:

request.setAttribute("userToken", <token>);
RequestDispatcher requestDispatcher = getServletContext().getContext(
                "/otherWebappContext").getRequestDispatcher("/resource");
requestDispatcher.forward(request, response);

但是,为被调用的 servlet 创建的任何会话都不同于调用 servlet 的会话。将请求转发到第二个应用程序后,它可以使用通过请求属性接收的数据创建新会话。

但出于安全原因,servlet 容器通常会阻止这些跨上下文操作。因此,您需要更改默认行为。例如,在Tomcat 6中,您需要将TOMCAT_HOME/conf/context.xml文件中<Context>元素的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 中。