我目前正在开发一个j2ee Web应用程序。该应用程序为用户提供了一种在忘记密码时重置密码的方法。
我有一个包含3列的数据库表:username,key和timestamp。 当用户请求更改密码时,我在该表中添加了一个用户名和随机密钥的条目(确保它们在表中没有重复的密钥,并且用户只能在表中出现一次)。我还添加了当前时间。然后,我向他们发送一封电子邮件,其中包含指向包含其密钥的应用程序的链接,例如:
mysite.com/app/reset?key=abcxyz123
处理此请求的servlet查看url中的键,以查找重置表中的匹配条目,以确定该键属于哪个用户。如果密钥与条目不匹配,我会显示错误页面,如果是,我会显示密码重置屏幕。用户更改密码后,我手动删除该重置表中的条目。
我正在尝试为密码重置链接实现等效的生存时间,这样我就没有不必要地在表中闲逛的条目了,我想到了2个选项,我已经实现了第一个:
1)创建一个EJB Timer,它会触发每一分钟删除重置表中时间戳超过30分钟的条目。这是一个手动过程,因为我使用hibernate作为我的jpa实现,所以我从表中检索所有条目,检查它们的时间戳,并删除旧的。
2)创建一个删除特定年龄的行的数据库作业?
我的问题是,有没有人看到第一种方法的任何缺点,第二种,甚至可能使用mysql的第二种选择?我想如果我可以使用第二种方法,我可以摆脱计时器,让数据库处理密码重置链接的生存时间,这可能更有效。
我没有长时间进行j2ee开发,但基于我所拥有的知识,这些似乎是两种逻辑方法。我欢迎任何意见。
答案 0 :(得分:0)
3)创建将连接到db,执行delete,disconnect的脚本。然后,您可以通过操作系统安排此脚本,例如crontab中。
关于选项1 - 该解决方案的缺点是它使用应用程序服务器资源来处理只能在数据库上完成并且不依赖/使用任何应用程序逻辑的东西。
好处是整个应用程序是自包含的,您不需要在数据库上进行任何额外的安装/设置任务,就像2和3一样。