登录登录对话框后重定向

时间:2015-10-14 22:44:12

标签: jsf authentication redirect

tl; dr:我的问题实际上可以恢复到如何通过字符串刷新页面(当没有知道参数时)?

我有两种方案可以登录用户:

  • 未经身份验证的用户访问受保护的页面,将其重定向到登录页面。登录后,他会被重定向到他主要尝试访问的页面。
  • 未经身份验证的用户点击我页面上的按钮,如果用户未经身份验证,则会显示模式对话框中的日志

例如:

<!-- user connected -->
<p:commandButton action="#{pollVoteBean.vote}" value="#{strings.Vote}" rendered="#{userNav.isUserConnected}"/>
<!-- user disconnected -->
<h:panelGroup rendered="#{!userNav.isUserConnected}">
    <p:commandButton type="button" value="#{strings.Vote}" onclick="PF('regSign').show()"/>
<!-- if the user clicks here a log in dialog appears and he can log in. -->
</h:panelGroup>

当未经身份验证的用户点击时会出现:

enter image description here

这是我在登录页面上使用的重定向用户:

lastUrl = getCorrectUrl(((String) FacesContext.getCurrentInstance()
        .getExternalContext().getRequestMap()
        .get(RequestDispatcher.FORWARD_REQUEST_URI)));

if (null != lastUrl && !"/signin".equals(lastUrl))
    return lastUrl + "?faces-redirect=true";
else
    return "/news?faces-redirect=true";

但是对于我要刷新页面的对话框。如何更改上面的代码,以便处理这两种情况?

我差不多了,但我无法获得带参数的正确网址(当然这是未知数):

lastUrl = getCorrectUrl(((String) FacesContext.getCurrentInstance()
            .getExternalContext().getRequestMap()
            .get(RequestDispatcher.FORWARD_REQUEST_URI)));
currentUrl = FacesContext.getCurrentInstance().getViewRoot()
        .getViewId();
if ("/signin".equals(currentUrl)) {
    if (null != lastUrl && !"/signin".equals(lastUrl))
        return lastUrl + "?faces-redirect=true";
    else
        return "/news?faces-redirect=true";
} else {
    return currentUrl + "?faces-redirect=true";
}

(上述代码假设用户已正确验证)。 我的对话框也是dynamic="true"

1 个答案:

答案 0 :(得分:0)

我最终将方法分成两部分,因为我发现没有简单的方法可以做到这一点。

public String signInUser() {
    if (trySignIn()) {
        if (null != lastUrl && !"/signin".equals(lastUrl))
            return lastUrl + "?faces-redirect=true";
        else
            return "/news?faces-redirect=true";
    } else {
        return "signin.xhtml?faces-redirect=true";
    }
}

public void signInFromDlg() {
    trySignIn();
}

然后javascript刷新oncomplete。