2013-04-22 54 views
1

我需要在Gmail中实现验证码功能。 如果用户第一次请求,则不会显示验证码图像。 但是,如果用户请求第二次登录,(用户第一次输入了错误的密码)需要显示验证码。如何检查请求是否来自同一客户端浏览器?

请让我知道如何检查请求是否来自同一用户,以便我可以在我的spring类中实现一些业务逻辑。

+0

检查您是否可以使用会话ID。 – 2013-04-22 10:28:00

回答

1

你为什么要将登录尝试绑定到具体用户?如果我是一个男性因子,我想猜测密码,我会使用可以使用代理的bruteforcer。

每次我有新的IP,所以你的验证码不适合我。

在我看来,更好的解决方案是存储不正确的登录尝试计数器。每次有人输入特定登录名的错误密码时,都会增加此登录名的计数器值。如果密码正确,则将此值设置为0.如果计数器值大于0,则会显示您的验证码。

+1

令人惊叹的答案Maksim。非常感谢..你已经将我的问题变成了一个非常简单的解决方案。 – atulsri 2013-04-22 11:18:23

+0

如果我的答案有帮助,可以将其标记为最佳。 – 2013-04-22 13:06:06

0

在服务器端(servlet的)创建此会议

session.setAttribute("count",i); //you can use getAttribute() method to check the count. 
+0

该属性对所有用户都是通用的吗?我如何才能使它成为单个用户的具体数字? – atulsri 2013-04-22 10:47:08

+0

不同的浏览器请求不同。会话对象是为第一个传入请求创建的,稍后每个请求由同一个会话对象标识。所以'count'存储在会话中。 – AmitG 2013-04-22 10:49:45

+0

换句话说,它对每个浏览器请求都是*不*不同。 – EJP 2013-04-22 12:06:46

1

连接柜台HTTP会话中命中HttpSession

HttpSession session = request.getHttpSession(); 

,并保持计数。您可能需要将会话存储在服务器端,而在分布式ENV中,您应该跨服务器同步HTTP会话。您也可以将该信息存储到客户端Cookie中。

0

有一对夫妇的方式做到这一点:

  • 当第一次加载页面,启动一个会话(或发送一个coookie)。对会话/ cookie使用计数。一旦你第二次找到cookie,你可以吐出一个验证码。
  • 使用隐藏的表单域。把一个特殊的名字/价值对,你可以识别第二个请求,并发送一个验证码。
  • 使用AJAX!这将涉及使用XMLhttprequest提交您的表单,如果无效,您可以显示验证码!这可能会给你更多的控制权,但是以重新工作为代价。

最后两个项目符号假设您想对错误的密码进行验证,而不是对不同的请求/页面重新加载。

以上每种方法都有其优缺点。您需要根据您的需要选择一种或多种组合或多种组合。

相关问题