1

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

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

当我尝试这样做时,返回 login.xhtml 页面的链接工作正常,但安全系统似乎忘记了在用户通过身份验证后尝试将其发送到何处。当用户正确验证时,会引发异常,因为系统尝试加载不存在的页面(登录页面 URL 的某些损坏版本)。

我想我可以将用户引导回主页并让他们从那里再试一次,但是我很长时间没有看到一个应用程序有这么多杂乱无章的东西。感谢所有的想法和帮助...

4

2 回答 2

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 操作。

于 2011-04-03T19:45:32.590 回答
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")
}
于 2011-08-16T01:15:50.150 回答