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 中。