Java Web应用程序对象调度

时间:2013-09-06 06:35:34

标签: java servlets web-applications

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

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

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

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

3 个答案:

答案 0 :(得分:1)

HttpSession对象的作用域是应用程序(或servlet上下文)级别。

摘自Java™ Servlet Specification

  

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中,您需要在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>

答案 1 :(得分:0)

没有HttpSession对象不可用于同一服务器中存在的所有应用程序。 要验证,

创建2个应用, 在一个应用程序中使用seesion.setAttribute(“hello”,“hello”); 现在运行第二个应用程序

if(session.getAttribute("hello")==null)
{
//some codes to check
}
else

{
//some codes to check
}

您将看到如果部分将被执行

答案 2 :(得分:0)

应用程序之间不共享HttpSession对象。在容器中的不同应用程序之间共享信息的标准方法是使用ServletContext。 ServletContext的唯一限制是,如果Web应用程序在多个JVM之间分发,这将无法工作,因为上下文信息位于一个JVM中。