【问题标题】:Disk storage in a Java EE applicationJava EE 应用程序中的磁盘存储
【发布时间】:2011-06-05 11:12:03
【问题描述】:

我有 Java EE 应用程序,我想在其中将少量数据存储到磁盘,例如只是用户/密码。

对于这么少的数据,我不想经历与完整数据库集成的麻烦。

除了使用数据库之外,是否有标准的方式来访问文件系统和标准文件夹,Web 应用程序可以在其中将数据存储在磁盘上?

注意:

我没有使用 EJB。这是一个使用 Servlet 的 Web 应用程序。

【问题讨论】:

    标签: java database jakarta-ee persistence


    【解决方案1】:

    您可以考虑使用preferences API 来存储这些数据 - 它也可以在 Java EE 上使用。

    【讨论】:

    • 但是要将属性存储到哪个路径/文件?
    • @pdeva:首选项 API 将其抽象出来,您只需决定首选项是系统范围的还是特定于当前操作系统用户的,然后为它们选择一个包。 IIRC 它将存储在 Windows 上的注册表和 Linux 上用户主目录中的隐藏文件中。但这不再是您关心的问题了 - 正是您想要的。
    【解决方案2】:

    使用简单的基于 Java 的数据库,例如 HSqlDB 或 h2。与重量级数据库相比,设置不会那么复杂。这将为您提供的主要优势是管理并发更新,如果您使用直接文件访问,则必须自己编写代码。

    【讨论】:

    • 另一个好点 - 并发和需要同步 +1
    【解决方案3】:

    由于 EJB 规范对 bean 提供者的限制,文件访问在基于 EJB 的应用程序中一直是一个有争议的活动。与此处相关的规范部分位于标题为“编程限制”的部分下,它说明了有关访问文件系统的以下内容。

    企业 bean 不得使用 java.io 包尝试访问 文件中的文件和目录 系统。

    这是一个相当具体的陈述,随后是对为什么会这样的简短解释。

    文件系统 API 不是 非常适合业务组件 访问数据。业务组件 应该使用资源管理器 API, 比如JDBC,来存储数据。

    虽然这个解释强调了不使用文件 I/O 的一个关键原因,但我认为还有更多。然而,尽管这是一个众所周知的限制,但实际上查找更多关于此的信息是一项耗时的任务。所以,在求知的过程中,我做了一些挖掘,想出了以下为什么文件 I/O 是“一件坏事”TM 的原因。

    Java 和 J2EE 的 WORA 口头禅意味着实际上可能没有文件系统可供访问。我见过各种 cmets 说 J2EE 服务器可能在一些没有文件系统的设备上运行,或者应用程序服务器无法访问文件,因为它部署在例如数据库服务器中。尽管这是一个正当的理由,但我认为这不适用于大多数项目。 对文件的访问不是事务性的。是的,通常,文件不是事务性资源,在构建企业系统时,您通常希望确保某些信息已正确准确地存储,因此需要使用关系数据库等。 访问文件系统是一个潜在的安全漏洞。如果我们查看其他资源(例如 JDBC 数据源、JMS 主题等)是如何访问的,通常是通过 JNDI。为了确保只有授权方可以访问这些资源,我们通常会通过某种身份验证机制保护此类资源,无论是用户名/密码组合还是 SSL 证书。文件系统的问题在于它们更加开放并且更难控制访问。一种解决方案是通过操作系统锁定文件访问,另一种是使用 Java 安全模型来限制对磁盘特定部分的访问。如果您要从业务组件访问文件系统,那么锁定访问权限将有助于使系统更加安全和抵御攻击。 那么,我们应该如何从 EJB 访问文件呢?许多人主张使用中间 Java 类来包装文件访问,认为 EJB 规范只不允许从 bean 类本身进行访问。这是真的?我没有被说服,因为所有相同的理由都适用。规范本身提供了一个答案,这个答案是使用资源管理器,以便我们可以将文件访问视为安全的、事务性的、池化资源。一种这样的实现是您编写、部署和配置以访问您的文件系统的J2EE Connector Architecture (JCA) adapter。事实上,一些供应商已经构建了访问平面文件的 JCA 适配器,如果您必须访问传统大型机系统的输出,这些适配器特别有用。

    当然,可以解决许多类型的文件访问。例如,配置信息可以放在 LDAP、JNDI、数据库中,甚至可以放在 JAR 文件中传递的属性文件中,这些文件通过类加载器作为资源加载。在需要访问文件的情况下,其他解决方案包括通过 servlet 容器加载文件、通过消息传递将其发送到 EJB 层、通过套接字连接从 Web 服务器下载文件等等。

    这些都是编程限制的解决方法,但归根结底,我认为你必须务实。许多项目确实利用 EJB 层内的文件访问,并且他们的解决方案有效。尽管 EJB 规范施加了限制,但实际上许多供应商选择不强制执行此限制,这意味着使用 java.io 包访问文件是可能的。无论您想出什么解决方案,理想情况下,您都应该牢记规范。它可以帮助您构建可移植和可升级的应用程序,但应该采用实用主义。希望 EJB 规范的未来版本能够更详细地解决这个问题,并且这个争议将成为过去。

    以上归功于:Simon Brown

    此外,在您的网站上保留密码绝不是一个好主意。大多数安全参考都告诉您保留可以检查的密码哈希是可以的。如果有人闯入您的网站,那么他可以检索所有用户的所有密码。

    【讨论】:

    • 此外,Java EE 服务器可能运行在具有独立文件系统的多台计算机上。因此,如果两部分用户交互在节点 A 上运行第 1 部分,在节点 B 上运行第 2 部分,则节点 B 无法看到在节点 A 上完成的文件系统更改。
    【解决方案4】:

    除了使用数据库之外,有没有一种标准的方式来访问文件系统和一个标准的文件夹,Web 应用程序可以在其中将其数据存储在磁盘上?

    java.io.File API,但 Servlet 或 Java EE 规范不提供标准目录,您可以在其中长时间保存文件。在最好的情况下,javax.servlet.context.tempdir 属性可用于从ServletContext 定位临时文件目录的位置。

    不支持标准文件目录的原因是无法预测容器是否能够访问文件系统。您的容器可能一开始就在嵌入式设备上运行,这可能依赖于 SAN 或其他远程文件系统来保存文件。

    此外,由于文件系统的非事务性质,在 EJB 中使用 File API 是不受欢迎的,因此没有类似的工作目录和文件的概念。

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多