我现在正在学习 Struts 2,并尝试创建一个登录尝试计数器,以在 x 次尝试失败后阻止任何进一步的登录尝试。
这是我的 login.jsp 的正文
<body>
<h1><s:property value="loginAttempts"/></h1>
<s:form action="login">
<s:textfield name="username" label="Username" />
<s:password name="password" label="Password"/>
<%-- <s:hidden name="loginAttempts" value="<s:property value="loginAttempts"/>" /> --%>
<s:set var="loginAttempts"><s:property value="loginAttempts"/></s:set>
<s:submit value="login"/>
</s:form>
</body>
还有我的 Action 类(我不包括带有 getter 和 setter 的私有 var,但它们都在那里)
public String execute() throws Exception{
if (username.equals("admin")&& password.equals("admin"))
{ return SUCCESS;}
else if (Integer.parseInt(getLoginAttempts())>2)
{
return "lockout";
}
else
{ setLoginAttempts(String.valueOf(Integer.parseInt(getLoginAttempts())+1));
return "fail";}
}
在最初调用 login.jsp 的操作中,我传入一个初始值
loginAttempts="0";
这很好用。当我在 login.jsp 页面上点击提交时,问题就来了。
我得到以下堆栈跟踪
java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:417)
java.lang.Integer.parseInt(Integer.java:499)
com.struts.users.LoginAction.execute(LoginAction.java:17)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
第 17 行是
else if (Integer.parseInt(getLoginAttempts())>2)
每次我点击提交按钮时,loginAttempt
它都会将变量重置为NULL
.
谢谢
编辑:我知道这可能不是这样做的正确方法,我可能应该在会话中这样做。但是我试图理解为什么它不起作用。