我在glasfish 3.1中使用oracle11进行了JDBCRealm设置。我的网络应用程序身份验证工作正常,但现在我想能够做出反应,如果有人连续3次登录失败。查看我的服务器日志,我可以看到每次登录失败时都会记录一个异常:
WARNING: WEB9102: Web Login Failed:
com.sun.enterprise.security.auth.login.common.LoginException:
Login failed: Security Exception
你们知道在我的java代码中以编程方式捕获它的方法吗?我试着谷歌搜索它,但无济于事。
或者您可能完全了解更好的解决方案?请分享。
谢谢, 达莫
更新: 我需要重新说出问题(或正确解释情况)。每次身份验证失败时,我都希望将其记录在我的数据库中。为此,我需要用户名,时间戳等。每次身份验证失败时,系统都会检查失败次数,如果超过3,则会锁定用户的帐户。所以,我可以在我的loginerror.jsp中完成,但我需要用户名。在任何地方都找不到:)。到目前为止,我尝试了一个过滤器,但似乎你无法过滤j_security_check url-patter(至少不在glassfish 3.1中)。实际上,这里的主要问题是将登录失败的人的用户名传递给loginerror.jsp(以任何形式:属性,参数等等)。将去尝试一些java脚本和表单提交..呵呵。感谢。
答案 0 :(得分:1)
如果您手持登录,则只能抓住它。您需要提交到使用HttpServletRequest#login()
的servlet,而不是将表单提交到j_security_check
。
try {
request.login(username, password);
} catch (ServletException e) {
// Handle.
}
答案 1 :(得分:1)
我认为您可以在web.xml中指定form-error-page。
您可能可以在那里指定一个servlet,将用户重定向到您想要显示的页面。
http://download.oracle.com/docs/cd/E19798-01/821-1841/bncas/index.html#6nmq2cpkm
<login-config>
<auth-method>FORM</auth-method>
<realm-name>file</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/error.xhtml</form-error-page>
</form-login-config>
</login-config>