我为Tomcat 7编写了一个自定义领域。我将其包装在默认安装的Tomcat提供的锁定领域中。锁定功能可以正常工作,但是在我的web.xml中,
<error-page> <error-code>403</error-code> <location>/forbidden.html</location> </error-page>
这会将所有未通过身份验证的用户定向到该页面。但是,如果被正确验证的用户被锁定,它还会将其重定向到该页面。当用户错误地进行身份验证并被锁定时,是否可以通过某种方式检测到差异?
看起来并不容易。我的第一个想法是子类化,LockOutRealm如果用户被锁定,则向请求上下文添加一些内容,您可以稍后将其打印到用户界面。不幸的是,它不起作用,因为刚才的authenticate方法LockOutRealm获得了登录名和密码,并且那里没有请求或上下文对象。
LockOutRealm
authenticate
另一个问题是,当身份验证失败时,authenticate方法将返回null,并且LockOutRealm也会这样做。LockOutRealm身份验证失败时,的行为与任何其他领域的行为之间没有区别。
null
解决方法:如果您正在使用Servlet 3.0,请使用接口的login方法,HttpServletRequest自己实现锁定逻辑,并在Servlet调用之前检查失败的登录尝试次数HttpServletRequest.login() 。如果高于限制,则不要调用login()并打印自定义错误消息。
login
HttpServletRequest
HttpServletRequest.login()
login()