我目前正在 Glassfish 上运行 JPA/EJB/JSF 应用程序,并使用安全 JDBC 领域进行身份验证。该领域运行良好,满足要求,直到客户要求对导航进行小幅更改。
今天,如果您尝试访问受保护的页面,身份验证机制会将您重定向到 web.xml 中指定的登录页面。完美的!身份验证成功后,您将被重定向回您尝试访问的页面。很公平。但是,客户决定在每次成功的身份验证后,无论他/她之前尝试访问哪个页面,都应该将用户重定向到主页。问题是,我们如何更改领域以便在每次成功验证后重定向到固定页面?
我目前正在 Glassfish 上运行 JPA/EJB/JSF 应用程序,并使用安全 JDBC 领域进行身份验证。该领域运行良好,满足要求,直到客户要求对导航进行小幅更改。
今天,如果您尝试访问受保护的页面,身份验证机制会将您重定向到 web.xml 中指定的登录页面。完美的!身份验证成功后,您将被重定向回您尝试访问的页面。很公平。但是,客户决定在每次成功的身份验证后,无论他/她之前尝试访问哪个页面,都应该将用户重定向到主页。问题是,我们如何更改领域以便在每次成功验证后重定向到固定页面?
你不能。容器管理的身份验证不允许这种细粒度的配置(这正是Apache Shiro和Spring Security等第三方身份验证框架存在的原因)。
最好的办法是用程序登录替换容器管理登录。将提交给这样的 JSF 操作方法的<form action="j_security_check">
by更改为<h:form>
public void login() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
try {
request.login(username, password);
externalContext.redirect(homepageURL);
} catch (ServletException e) {
context.addMessage(null, new FacesMessage("Unknown login"));
}
}