Java 如何将用户转发到;重置密码“;如果用户尝试使用无效用户名登录超过3次,则返回页面(&A);密码(STRUTS2)

Java 如何将用户转发到;重置密码“;如果用户尝试使用无效用户名登录超过3次,则返回页面(&A);密码(STRUTS2),java,struts2,interceptor,Java,Struts2,Interceptor,我想实施: 如果用户尝试使用无效用户名和密码登录超过3次。我想把它们转发到我的“重置密码页面” 这背后的逻辑是什么。我无法理解这个问题的确切逻辑。请帮忙 我想申请的是: 将我的表单文本字段中的默认值作为我的表单中的Login\u trunt=1传递 //geter & setter of loginAttempt if(loginAttempt>3) { return resetPassword;//forwarding to resetPassword.jsp from

我想实施:

如果用户尝试使用无效用户名和密码登录超过3次。我想把它们转发到我的“重置密码页面”

这背后的逻辑是什么。我无法理解这个问题的确切逻辑。请帮忙

我想申请的是: 将我的表单文本字段中的默认值作为我的表单中的
Login\u trunt=1
传递

//geter & setter of loginAttempt
if(loginAttempt>3)
{
    return resetPassword;//forwarding to resetPassword.jsp from my struts.xml
} 
else
{    
    //perform other tasks
}
但是从我上面的逻辑来看,我有一个疑问:如何在每次表单提交时增加
loginatetest
值。因此,我的上述代码将为我工作


如果您有任何其他逻辑要实现。请与我分享。

按照您的意愿这样做将成为一个安全漏洞,因为尝试次数将是html的一部分,因此任何人都可以更改它(您不需要特殊工具,您可以使用chrome开发工具等工具)。因此,有了这一点,一些恶意用户可能会让程序无限次尝试暴力攻击

为避免此安全漏洞,您可以使用以下方法之一:

  • 存储会话中的尝试次数。在我看来,这是使用Struts2作为框架的最简单的方法。 要在Struts2操作中获得会话,您应该实现接口。 另外,当用户成功登录后,不要忘记重置尝试值

  • 一些开发人员不喜欢使用会话,所以他们使用数据库。就性能而言,这是一种比会话更好的方法,特别是当您的网站拥有大量用户时

  • 另一种选择是在表单中使用cookie甚至隐藏参数,但对其信息进行加密(第一种是RubyonRails框架的aproach)

最佳选择取决于项目的要求。在我看来,你不应该使用最后一个选项,除非你正在使用某种框架或工具来支持它

要在其他两个选项中进行选择,一个好的指标是您希望您的网站拥有的用户数量(如果您的用户数量很少,或者您正在创建一个私人网站,那么会话可能是一个更好的方法。数据库总是很好,但所需的开发时间通常较高,并且可能会对可维护性造成更大的危害)


当然有更多的解决方案,但我想我已经介绍了最常见的解决方案。

按照您的意愿这样做会成为一个安全漏洞,因为尝试的次数是html的一部分,所以任何人都可以更改它(您不需要特殊的工具,您可以使用chrome开发工具来实现)。因此,有了这一点,一些恶意用户可能会让程序无限次尝试暴力攻击

为避免此安全漏洞,您可以使用以下方法之一:

  • 存储会话中的尝试次数。在我看来,这是使用Struts2作为框架的最简单的方法。 要在Struts2操作中获得会话,您应该实现接口。 另外,当用户成功登录后,不要忘记重置尝试值

  • 一些开发人员不喜欢使用会话,所以他们使用数据库。就性能而言,这是一种比会话更好的方法,特别是当您的网站拥有大量用户时

  • 另一种选择是在表单中使用cookie甚至隐藏参数,但对其信息进行加密(第一种是RubyonRails框架的aproach)

最佳选择取决于项目的要求。在我看来,你不应该使用最后一个选项,除非你正在使用某种框架或工具来支持它

要在其他两个选项中进行选择,一个好的指标是您希望您的网站拥有的用户数量(如果您的用户数量很少,或者您正在创建一个私人网站,那么会话可能是一个更好的方法。数据库总是很好,但所需的开发时间通常较高,并且可能会对可维护性造成更大的危害)


当然,还有很多解决方案,但我想我已经介绍了最常见的。

要大致回答您的新问题,完全未经测试:

公共类登录{
//省略了getter、setter、密码检查、utils等。
公共字符串execute(){
返回到多个尝试(密码)?重置\u密码:成功;
}
公共布尔值ToomAnyAttents(字符串密码){
整数尝试次数=默认值(session.get(LOGIN\u尝试次数),0);
尝试次数=密码正确()?0:尝试次数+1;
session.put(登录尝试、尝试);
返回次数>3次;
}
}

您的代码有点难读。

要大致回答您的新问题,完全未经测试:

公共类登录{
//省略了getter、setter、密码检查、utils等。
公共字符串execute(){
返回到多个尝试(密码)?重置\u密码:成功;
}
公共布尔值ToomAnyAttents(字符串密码){
整数尝试次数=默认值(session.get(LOGIN\u尝试次数),0);
尝试次数=密码正确()?0:尝试次数+1;
session.put(登录尝试、尝试);
返回次数>3次;
}
}

您的代码有点难读。

谢谢,但我现在确实想使用seision来实现此目的,它将不会作为参数传递。我将在我的动作类中创建getter和setter。并且它不会显示在用户浏览器中。所以它不会成为一个安全漏洞。它将是html的一部分,所以任何人都可以更改它(你不需要特殊的工具,你可以用chrome开发工具来实现)。因此,考虑到这一点,一些恶意用户可能会制作一个程序来