将登录页面重定向到JSF中的另一个页面

时间:2015-09-29 11:46:25

标签: jsf jsf-2 primefaces login

我正在为我的网站做一个管理面板。我使用PrimeFaces登录表单为admin.I可以登录并查看messages.But我想在管理员登录后将页面重定向到另一个页面。我不能这样做我怎么办?

<h:form>
    <p:growl id="growl" sticky="true" showDetail="true" life="3000" />

    <h:panelGrid columns="2">
        <h:outputLabel for="username" value="Username:" />
        <p:inputText id="username" value="#{userLoginView.username}" required="true" label="username" />
        <h:outputLabel for="password" value="Password:" />
        <p:password id="password" value="#{userLoginView.password}" required="true" label="password" />

        <h:column>
            <p:commandButton value="Login"
                             update="growl"
                             actionListener="#{userLoginView.login}"
                             oncomplete="handleLoginRequest(xhr, status, args)" />
        </h:column>
    </h:panelGrid>
</h:form>
@ManagedBean
public class UserLoginView {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void login(ActionEvent event) {
        RequestContext context = RequestContext.getCurrentInstance();
        FacesMessage message = null;
        boolean loggedIn = false;

        if (username != null && username.equals("admin") && password != null && password.equals("admin")) {
            loggedIn = true;
            message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", username);
        } else {
            loggedIn = false;
            message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Loggin Error", "Invalid credentials");
        }

        FacesContext.getCurrentInstance().addMessage(null, message);
        context.addCallbackParam("loggedIn", loggedIn);
    }
}

3 个答案:

答案 0 :(得分:1)

您可以使用action属性代替actionListener属性,只需在操作方法中返回导航信息。

例如:

return "theApplicationPage.xhtml?faces-redirect=true";

您应该使您的支持bean视图作用域(JSF 2.2与CDI兼容)。你可以写:

@Named
@ViewScoped
public class UserLoginView  implements Serializable{
    private static final long serialVersionUID = 1L;
    ....

答案 1 :(得分:1)

您可以简单地为方法提供重定向操作:

在Managed Bean中,在登录方法中:

if (username != null && username.equals("admin") && password != null && password.equals("admin")) {
    loggedIn = true;
    message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", username);
// Edit :
    FacesContext context = FacesContext.getCurrentInstance();
    context.getExternalContext().redirect("/newfodler/newindex.xhtml");

无关:要在新的重定向页面中显示结果的消息(如欢迎用户名),您应该使用:

    context.getExternalContext().getFlash().setKeepMessages(true);

这样,网页之间的交易信息就不会丢失。

答案 2 :(得分:0)

由于我无法评论,我几乎都在回应lametaweb消息。

您可以使用action属性而不是actionListener属性,只需在操作方法中返回导航信息。

例如:

return "theApplicationPage.xhtml?faces-redirect=true";

相反,我会返回一个字符串&#34; theApplicationPage&#34;

return "theApplicationPage";

并在faces-config.xml中创建导航规则:

<navigation-rule>
    <display-name>login.xhtml</display-name>
    <from-view-id>/jsp/login.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>theApplicationPage</from-outcome>
        <to-view-id>/jsp/menu.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>    

我会将支持bean会话作为范围,您可能稍后会使用它来呈现或向您的网站添加更多功能。只需添加 @SessionScoped

在@ManagedBean之后。