Primefaces mobile使用HttpServletRequest导航问题

时间:2011-10-12 14:10:19

标签: jsf servlets primefaces

我在主要移动页面(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页面。

有什么建议吗?谢谢

1 个答案:

答案 0 :(得分:0)

这不完全是在JSF中发送重定向的正确方法。我不确定为什么它在“普通”JSF中工作(那也应该在那里失败!)。在重定向之后,您基本上需要调用FacesContext#responseComplete()来指示JSF它不应该导航到默认结果。但是,更好的方法是使用ExternalContext#redirect()执行重定向,因为它会隐式执行此操作。

所以在你的情况下,替换

((HttpServletResponse) ec.getResponse()).sendRedirect(encodedURL);

通过

ec.redirect(encodedURL);