使用哈希表而不是数据库系统

时间:2015-06-28 05:48:22

标签: java jsp servlets hashmap hashtable

我被要求使用html,jsp和servlets开发登录系统。登录页面应该询问用户用户ID和密码,并且在身份验证后应显示欢迎消息。还应该有添加新用户和更改现有用户密码的规定。然而,这里的问题是我被要求使用哈希表而不是数据库系统。我对使用Oracle实现此系统有一个相当好的想法。据我所知,在核心java中,散列表/散列映射的范围是程序本身的生命周期。当程序结束时,散列表值会丢失。如果我在servlet中实现一个hashmap,它会有所不同吗?如果我应该如何继续?

2 个答案:

答案 0 :(得分:1)

  

据我所知,在核心java中,散列表/散列映射的范围是程序本身的生命。

不一定。这取决于您的应用程序如何处理hashmap。但是,您的生命周期不再而不是应用程序的生命周期,这是正确的。

  

当程序结束时,散列表值丢失。

正确。

  

如果我在servlet中实现一个hashmap,它会有所不同吗?

没有。当appserver退出hashmap时将会消失。

所以你没有问的问题是如何处理这个“要求”。我建议如下:

  • 确定登录系统的状态(即用户名和密码)是否应该在重新启动网络服务器时持续存在。如果没有,则使用HashMap

  • 如果需要保留,那么您需要找到一种方法来保存HashMap的状态而不使用数据库。有各种可能性:

    • 使用Java Object Serialization保存数据结构并重新加载。

    • 使用“绑定”技术序列化为XML或JSON或类似技术。

    • 编写一个临时机制,将数据结构保存到文件中并重新加载。

问题是以“防弹”的方式实施保存/重新加载是很棘手的;即,如果出现错误,应用程序被杀死,电源出现故障等情况,将不会丢失或损坏状态。一个像样的数据库处理这些事情,这就是数据库是首选实现方法的原因。

另一件需要注意的是,以明文或加密方式存储实际密码是不好的做法。这适用于您实现登录系统状态持久性的方式。相反,您应该将用户的密码与“salt”一起散列,并将其与先前记录的散列进行比较。

  

它是一项家庭作业。主要是实施它。

这意味着您可能会忽略我上面提到的安全性和健壮性问题。 (但在现实世界的系统中......你不应该!)

答案 1 :(得分:0)

您可以遵循简单解决方案的步骤

1)当用户注册到应用程序时,创建属性/文本文件并将键值对以登录ID作为键和密码存储为值,或者您可以考虑xml或json格式。如果您需要考虑使用安全散列算法,可能需要考虑安全性。

2)当您停止应用程序时,凭据将存储在您的文件中而不是db。

3)当应用程序启动时,您可以创建一个映射并从存储的文件中加载键值对,或者您可以直接使用java io的属性文件来验证凭据。