我有Java EE应用程序,其中我想要少量数据到磁盘,例如只是用户/密码。
我不想经历与这个少量数据集成完整数据库的麻烦。
是否有标准方法来访问文件系统和标准文件夹,Web应用程序可以将数据存储在磁盘上,而不是使用数据库?
注意:
我没有使用EJB。它是一个使用Servlets的Web应用程序。
答案 0 :(得分:3)
您可以考虑使用preferences API来存储这些数据 - 它也可以在Java EE上使用。
答案 1 :(得分:3)
使用简单的基于Java的数据库,如HSqlDB或h2。与重量级DB相比,设置不会那么复杂。这将给您带来的关键优势是管理并发更新,如果您使用直接文件访问,则必须自行编码。
答案 2 :(得分:2)
由于EJB规范对bean提供程序的限制,文件访问在基于EJB的应用程序中始终是一项有争议的活动。此处相关规范的一部分在题为“编程限制”的部分下,并说明了有关访问文件系统的以下内容。
企业bean不得使用 java.io包尝试访问 文件中的文件和目录 系统
这是一个相当具体的陈述,后面是对这种情况的简短解释。
文件系统API不是 非常适合商业组件 访问数据。业务组件 应该使用资源管理器API, 例如JDBC,用于存储数据。
虽然这个解释强调了不使用文件I / O的一个关键原因,但我认为还有更多内容。然而,尽管这是众所周知的限制,但实际上找到更多关于此的信息是一项耗时的任务。因此,在寻求知识的过程中,我进行了一些挖掘,并提出了以下理由:为什么文件I / O是“坏事”TM。
Java和J2EE的WORA口号意味着实际上可能没有文件系统可供访问。我已经看到各种评论说J2EE服务器可能在没有文件系统的某些设备上运行,或者应用程序服务器无法访问文件,因为它部署在例如数据库服务器中。虽然这是一个正当理由,但我认为这不适用于大多数项目。 访问文件不是事务性的。是的,通常,文件不是跨国资源,在构建企业系统时,您通常希望确保某些信息已正确且准确地存储,因此使用关系数据库等。 访问文件系统是一个潜在的安全漏洞。如果我们看一下如何访问其他资源(例如JDBC DataSources,JMS Topics等),通常是通过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
此外,在您的网站上保留密码绝不是一个好主意。大多数安全性引用告诉您可以保留可以检查的密码哈希值。如果有人闯入您的网站,那么他可以检索所有用户的所有密码。
答案 3 :(得分:1)
是否有标准方法来访问文件系统和标准文件夹,Web应用程序可以将数据存储在磁盘上,而不是使用数据库?
有java.io.File
API,但Servlet或Java EE规范不提供标准目录,您可以在其中持久保存文件。在最好的情况下,javax.servlet.context.tempdir
属性可用于从ServletContext
找到临时文件目录的位置。
不支持标准文件目录的基本原理是由于无法预测容器是否能够首先访问文件系统。您的容器可能首先在嵌入式设备上运行,这可能依赖于SAN或其他远程文件系统来保存文件。
此外,由于文件系统的非事务性质,在EJB中使用File API是不受欢迎的,因此没有类似的工作目录和文件的概念。