0

この問題が何度も議論されていることは知っていますが、私はそれを正すことができませんでした. これを機にご覧いただければ本当に幸いです。

だから、私は次の問題があります:

ユーザーがリンクを介して私のアプリケーションにアクセスしたい場合

http://example:8080/Kundenportal/protected/post/post.jsf 

彼は私のloginPageにリダイレクトされます(ログインしているかどうかを検証するPhaselistenerがあります)。

さて、ログイン後、ユーザーは

http://example:8080/Kundenportal/protected/post/post.jsf, 

代わりに、彼はにリダイレクトされます

http://example:8080/Kundenportal/protected/post/start.jsf.

ログイン後にユーザーをリダイレクトする場所をアプリケーションに伝えるにはどうすればよいですか? HttpRequestServlet を介して動作することはわかっていますが、Phaselistener でログインしているかどうかを確認した後、ユーザーはログインページにリダイレクトされます。つまり、requestURL が loginPage であり、これは間違っています。

これが私のコードです。

これは私の PhaseListener です:

@Override
public void afterPhase(PhaseEvent event) {
    FacesContext fc = event.getFacesContext();
    String currentPage = fc.getViewRoot().getViewId();

    HttpServletRequest origRequest = (HttpServletRequest) fc
            .getExternalContext().getRequest();
    //  Here is the requestURI post.xhtml 
    String reqURI = origRequest.getRequestURI();

    // boolean loginPage = page.startsWith("/login.xhtml");
    // boolean registerPage = page.startsWith("/registrierung.xhtml");

    boolean loginRequired = currentPage.startsWith("/protected/");
    if (loginRequired && !loggedIn(fc)) {
        NavigationHandler nh = fc.getApplication().getNavigationHandler();
        nh.handleNavigation(fc, null, "loginFAILED");
        fc.renderResponse();

    }

}

さて、これがfaces-confing.xhtmlの設定方法です:

at.ooev.kp.controller.login.LoggedInCheck

<application>
    <locale-config>
        <default-locale>de</default-locale>
        <supported-locale>de</supported-locale>
    </locale-config>
    <message-bundle>at.ooev.kp.messages</message-bundle>
    <resource-bundle>
        <base-name>at.ooev.kp.messages</base-name>
        <var>messages</var>
    </resource-bundle>
</application>  
<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>loginFAILED</from-outcome>
        <to-view-id>/login.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>doLogin</from-outcome>
        <to-view-id>/login.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>EXPIRED</from-outcome>
        <to-view-id>/expired.xhtml</to-view-id>
    </navigation-case>  
</navigation-rule>

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>PAGE_0_</from-outcome>
        <to-view-id>/protected/start.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_1_1</from-outcome>
        <to-view-id>/protected/pol/polizzen.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_1_2</from-outcome>
        <to-view-id>/protected/sch/schaden.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_1_3</from-outcome>
        <to-view-id>/protected/tk/topkundeninfo.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_2_</from-outcome>
        <to-view-id>/protected/daten/daten.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_2_1</from-outcome>
        <to-view-id>/protected/daten/kundendaten.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_2_2</from-outcome>
        <to-view-id>/protected/daten/benutzer.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_3_1</from-outcome>
        <to-view-id>/protected/post/post.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_4_1</from-outcome>
        <to-view-id>/protected/komm/vereinbarung.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>PAGE_5_1</from-outcome>
        <to-view-id>/protected/trans/transport.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

<navigation-rule>
    <from-view-id>/login.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>loginOK</from-outcome>
        <to-view-id>/protected/start.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>register</from-outcome>
        <to-view-id>/registrierung.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>loginPOST</from-outcome>
        <to-view-id>/protected/post/post.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

そして、これはログインした私のmanagedBeanです:

@PermitAll
public String login() {
    FacesContext fc = FacesContext .getCurrentInstance();
    HttpServletRequest origRequest = (HttpServletRequest) fc.getExternalContext().getRequest();
    // The requestURI is here login.xhtml(because there was the redirection in the Phaselistener)
    String str = origRequest.getRequestURI();

    if (doLogin(credentials.getUsername(), credentials.getPassword())) {
        String realname = (!Utils.isEmpty(webbaUser.getVorname())) ? webbaUser
                .getVorname() + " "
                : "";
        realname += webbaUser.getName();
        user.setUsername(credentials.getUsername());
        user.setRealname(realname);
        user.setKndnr(credentials.getUsername());
        if ("kunde".equalsIgnoreCase(credentials.getUsername()))
            user.setKndnr("600828");
        user.setMailadresse(webbaUser.getEmail());
        user.setHostUserid(webbaUser.getHostuserid());

        HttpSession session = ((HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest())
                .getSession(false);
        session.setAttribute("LOGGEDINUSER", user.getUsername());
        dbLog.add(DbLogController.Aktion.LOGIN, user.getUsername());
        // List<String> kundennummern = webbaUser.getDatfilt();
        // for (String s : kundennummern)
        // System.out.println("datfilt: " + s);
        return "loginOK";
    } else {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage("Anmeldung fehlgeschlagen!"));
        dbLog.add(DbLogController.Aktion.LOGINFAILED,
                credentials.getUsername());
        user = null;
        return null;
    }
}
4

1 に答える 1

1

フェーズ リスナーの LOGIN_REDIRECT などのセッション属性に URL を保持し、ログイン後に使用します。

Spring Security などの一部のフレームワークがそれを行います。

于 2013-05-02T13:53:37.643 に答える