我在主要移动页面(pm:page)之间执行url重定向。例如,从login.jsf
到/secure/myPage.jsf
,pm:pages。身份验证成功后,用户应重定向到myPage.jsf
。登录触发如下:
<pm:commandButton value="login" update="messages"
actionListener="#{loginbean.doLogin}" >
<f:param name="targetUrlParam" value="defaultTarget" />
</pm:commandButton>
和方法中的重定向:
public void doLogin(ActionEvent e) throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext ec = context.getExternalContext();
try {
HttpServletRequest req = (HttpServletRequest) ec.getRequest();
Authentication authentication = SecurityContextHolder.
getContext().getAuthentication();
... // Authentication stuff with Spring Security
try {
HttpSession session = req.getSession(false);
String cp = ec.getRequestContextPath();
String redirectUrl = cp;
... //performing some filtering depending on Roles and target-urls
}
String encodedURL = ec.encodeResourceURL(redirectUrl);
((HttpServletResponse) ec.getResponse()).sendRedirect(encodedURL);
} catch (AuthenticationException ae) {
UtilBean.addErrorMessage("bad_credential");
}
不幸的是,重定向不会发生!它可能与primefaces mobile 3.0M3的生命周期有关,因为一切都可以正常使用JSF页面。
有什么建议吗?谢谢
答案 0 :(得分:0)
这不完全是在JSF中发送重定向的正确方法。我不确定为什么它在“普通”JSF中工作(那也应该在那里失败!)。在重定向之后,您基本上需要调用FacesContext#responseComplete()
来指示JSF它不应该导航到默认结果。但是,更好的方法是使用ExternalContext#redirect()
执行重定向,因为它会隐式执行此操作。
所以在你的情况下,替换
((HttpServletResponse) ec.getResponse()).sendRedirect(encodedURL);
通过
ec.redirect(encodedURL);