使用基于表单的容器托管安全性重试登录

时间:2010-09-23 11:58:11

标签: java security java-ee-6 glassfish-3 jaas

我有一个部署在GlassFish 3.0.1上的Web应用程序,它使用容器管理的安全性。这是一个简单的,基于标准表单的实现,使用j_security_check来对抗JDBCRealm。保护应用程序的一切都很好(我不敢相信我过去使用过自己的安全系统)。

我似乎无法弄清楚如何处理用户输入错误密码的情况。我的“loginFailed.xhtml”页面显示正确,但我想直接将用户引导回登录页面(通过链接或自动)再试一次。

当我尝试这个时,返回login.xhtml页面的链接工作正常,但安全系统似乎忘记了在用户进行身份验证后尝试发送用户的位置。当用户正确地进行身份验证时,会引发异常,因为系统会尝试加载不存在的页面(登录页面URL的某些受损版本)。

我想我可以将用户引导回主页并让他们从那里再试一次但是我很久没见过那么多应用程序了。所有的想法和帮助都感激不尽......

2 个答案:

答案 0 :(得分:0)

我假设您只是在普通的html页面上使用j_security_check,对吗?您现在可以使用HttpServletRequest#login方法实际进行编程登录。

这是一个例子。

public String login() {

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

    try {
        request.login(this.userName, this.password);
        return "index?faces-redirect=true";
    } catch (Exception e) {
        return "error?faces-redirect=true";
    }

因此,您可以在登录后将它们发送到任何您想要的位置。这只是一个带有用户名和密码成员变量的标准JSF支持bean。

h:commandButton使用此登录方法作为jsf操作。

答案 1 :(得分:0)

实际上,如果您不想管理java中的登录,另一种解决方案是使用javascript。

login.html(简单的html表单)

<form name="loginForm" method="POST" action="j_security_check">
    <input id="username" type="text" />
    <input id="password" type="password" />
    <input type="submit"value="Login" />
</form>

然后为error.html添加一些javascript到body onload

function redirect() {
window.location("http://yournewurl")
}