【发布时间】:2012-12-23 11:57:42
【问题描述】:
我正在开发一个我们有身份验证机制的项目。我们在身份验证机制中遵循以下步骤。
- 用户打开浏览器并在文本框中输入他/她的电子邮件,然后单击登录按钮。
- 请求发送到服务器。我们生成一个随机字符串(例如,123456)并发送通知到用户的Android/iPhone,并借助
wait()方法使当前线程等待。 - 用户在手机上输入密码,然后点击手机上的提交按钮。
- 一旦用户单击提交按钮,我们就会使 Web 服务访问服务器并传递先前生成的字符串(例如 123456)和密码。
- 如果之前输入的电子邮件密码正确,我们将调用
notify()方法到之前等待的线程并发送success作为响应,然后用户进入我们的系统。李> - 如果密码与之前输入的电子邮件不正确,我们将调用
notify()方法到之前等待的线程并发送失败作为响应并向用户显示无效凭据消息。
一切正常,但最近我们转移到了集群环境。我们发现有些线程即使在用户回复后也没有得到通知,并且等待时间不受限制。
服务器方面,我们使用的是Tomcat 5.5,我们关注The Apache Tomcat 5.5 Servlet/JSP Container 制作tomcat集群环境。
回答 :: 可能的问题和解决方案
可能的问题是集群环境中的多个 JVM。现在我们还将集群的 Tomcat URL 连同生成的字符串一起发送到用户 Android 应用程序。
当用户点击回复按钮时,我们将生成的字符串与集群的 Tomcat URL 一起发送,因此在这种情况下,两个请求都将发送到同一个 JVM,并且工作正常。
但我想知道是否有针对上述问题的单一解决方案。
此解决方案存在问题。 如果集群 Tomcat 崩溃会怎样?负载均衡器会向第二个集群 Tomcat 发送请求,同样的问题会再次出现。
【问题讨论】:
-
当用户收到一个额外的密码 (OTP) 并使用他的常规密码并且 OTP 可以登录时,这在我看来就像一个网上银行解决方案。为什么需要通过电话登录?电子邮件中的点击可以将他重定向到登录页面,他可以在其中输入他的常规密码和将同时到达他的手机的 OTP。这种方式不需要等待/通知。
-
@Andras Kerekes:假设登录可以通过密码、面部认证、语音认证、指纹认证来完成,这些都可以在手机上而不是在网络应用程序上完成。所以通过这种方式,我们的认证系统会更加成熟,并且网络上没有密码之类的东西,所以我们更加安全。未来我们计划将第三方认证系统作为插件制作。
-
在这种情况下,他输入电子邮件地址的登录页面可以定期查询服务器是否通过电话登录成功/失败。我认为将应用服务器工作线程保持在等待状态不是一个好主意。如果有很多用户,应用程序可能会由于缺少工作线程而变得无响应。
标签: java tomcat web-applications architecture cluster-computing