gpt4 book ai didi

java - 用于跨多个 war 文件共享 session 数据的 Tomcat ServletContext 与 JNDI

转载 作者:行者123 更新时间:2023-11-28 21:57:01 24 4
gpt4 key购买 nike

我有一个基于 Struts 的 Web 应用程序,它的结构类似于下图所示的结构。 (不是这只是一个例子)

$TOMCAT_HOME/webapps/myapp
|-css
|-myapp.css
|-js
|-myapp.js
|-forum
|-index.jsp
|-list.jsp
|-users.jsp
|-Articles
|-index.jsp
|-ListArticles.jsp
|-Guestbook
|-viewGuestBook.jsp
|-AddnewEntry.jsp
|-WEB-INF
|-classes
com
|-myapp
|-forum
|-DisplayForum.class
|-ListUsers.class
|-article
|-ArticleList.class
|-AddArticle.class
|-guestbk
|-LoadGuestBook.class
|-ProcessGuestBook.class

目前,该应用程序是使用 ANT 构建的,并作为单个 war 文件(名为 myapp.war)部署到 Tomcat 应用程序服务器。我想分离应用程序,以便为每个模块使用多个 war 文件部署它。 (即forum.war、articles.war 和guestbook.war)。新的 war 文件的内容将只包含与模块相关的文件。例如,forum.war 文件将包含
$TOMCAT_HOME/webapps/forum              
|-forum
|-index.jsp
|-list.jsp
|-users.jsp
|-WEB-INF
|-classes
com
|-myapp
|-forum
|-DisplayForum.class
|-ListUsers.class

对于这种方法,有几件事我不确定。

共享静态资源

*.css 和 *.js 文件在每个 war 文件中都是通用的。如果我有不同的 war 文件,我将在每个 war 文件中都有一份 css 文件的副本。有什么办法可以以一种通用的方法交付资源文件(css、js、静态文件),以便共享它们。我想也许我应该包含一个名为 common.war 的新 war 文件并包含共享的静态数据。 (我认为其他 war 文件可以使用 URL 访问这些文件,因为它们是静态资源。对吗?)

共享类(class)

有一些类是全局共享的。例如,有一个名为 UserSession 的类。 .当用户登录到应用程序时,会创建 UserSession 对象并将其存储在 Hashtable 中,并且用户的 session ID 作为 Hashtable 的键。每当用户尝试访问应用程序的任何部分时,都会根据 Hashtable 中的 session ID 检查 session ID。

UserSession 对象做了很多事情——比如
  • 验证用户登录
  • 跟踪用户的 Activity
  • 将用户登录历史记录到数据库
  • 还有更多...

  • 我需要所有 war 文件(应用程序/模块)才能访问 UserSession对象,但只有一个与每个 session 相关联。我应该如何构建它以便用户的 session 跨越不同的 war 文件?

    我一直在阅读有关如何共享对象的信息,并提出了两个选项
  • 通过 JNDI 共享对象
  • 通过 Tomcat ServletContext 共享对象

  • 据我了解,如果一个对象存储在 ServletContext ,它可以被任何应用程序访问(即war文件)。如果我希望每个用户 session 有一个不同的实例,这将如何工作。例如,

    User1 登录 - UserSession 存储在 ServletContext 中
    User2 登录 - 我在哪里存储 User2 的 UserSession 对象?

    目前我将 sessionID 存储在 HTTPSessionUserSession HashTable 中的对象。
    HttpSession session = request.getSession(true);
    UserSession userSession = getUserSession(session.getId());

    User1 是否获得相同的 sessionId,而不管他/她正在访问哪个 war 文件?如果是这样,我可以在 ServletContext 中存储另一个 List 对象吗?包含 session ID?

    我还看到了对使用 JNDI 的对象共享的引用。我对 JNDI 不是很熟悉。我已经将 JNDI 用于数据源,但仅此而已。它究竟会如何运作?如果有人能指出我如何使用 JNDI 共享数据的示例,我将不胜感激。 JNDI 真的是更好的方法吗?为什么?

    最后, UserSession.class 在哪里?文件驻留?我知道我可以将它放在 $TOMCAT_HOME/lib 中的 jar 文件中但通常不推荐这样做。但问题是它是否在 WEB-INF/lib 中任何其他 war 文件都无法访问的 war 文件之一的文件夹。

    希望得到一些意见/建议。我很想知道您使用什么策略来部署由多个 war 文件组成的应用程序。

    谢谢

    编辑

    好吧,我忘了提及为什么我要拆分 war 文件。基本上,我们有几个开发团队。我们遇到过这样的情况,一个团队在应用程序的特定领域工作,而另一个团队在不同的领域工作。

    例如假设以下场景 -

    Team1 正在开发将于下个月发布的论坛模块。
    Team2 已被要求对文章进行更改,并应在下周发布。

    如果 Team1 已 checkin 他们的代码并正在执行需要一个多星期的系统/集成测试,则 Team2 因为必须等待而被塞满。

    这些类型的问题通常使用分支来解决,但我们倾向于避免分支,因为它在合并时引入了很多复杂性,我们决定避免分支。

    另一个原因是我们有一个较旧的应用程序,我正在考虑与此应用程序重用。基于纯 HTTPServlet 的旧应用程序。即不基于任何框架(即结构、 Spring 等)。如果我想将它与我现有的应用程序集成,我将需要使用 session/servletcontext。

    此外,很多人怀疑如果您进行简单的更改(例如,您将新的样式表定义添加到单个 css 文件),您必须重建和重新部署整个应用程序。

    其他原因包括
  • 可以简化可扩展性/负载平衡 - (可能?)不确定这个。我正在考虑将每个 war 文件部署到不同的服务器/集群。
  • 降低 PERMGEN 内存要求
  • 等等...
  • 最佳答案

    我不确定您是否理解正确,但是每个用户(浏览器 session )以及每个应用程序 AFAIK 的 HttpSession 都不同,因此您不能使用它来共享数据。

    基本上,您需要在 Web 应用程序之间进行通信。
    您可以让一场 war 充当您的 UserSession 的数据管理器,而所有其他 war 都与这一 war 进行通信。数据管理器应用程序需要公开一个服务,例如可以通过其他应用程序访问的 UserSessionManager。

    JNDI 是一种传统的解决方案。 Spring 对此有一些帮助,但 JNDI API 也不太复杂。在数据管理器 war 中,您可以在初始化方法中执行以下操作:

    DataManager mgr = new DataManagerImpl(...);
    InitialContext ic = new InitialContext();
    ic.rebind("java:global/env/datamanager", mgr);

    您使用的接口(interface)和数据对象需要放在一个在所有“客户端” war 中共享的 jar 中,实现仅在数据管理器 war 中。在您的客户端 war 中,您可以执行以下操作:
    InitialContext ic = new InitialContext();
    DataManager mgr = (DataManager)ic.lookup("java:global/env/datamanager");

    希望这有帮助,
    吉尔特。

    关于java - 用于跨多个 war 文件共享 session 数据的 Tomcat ServletContext 与 JNDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9251434/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com