6

JSF では、ログインが成功する前にセッションが作成されるようです。つまり、単にログイン ページを要求するだけで、新しいセッションが作成されます。

正常にログインした各ユーザーではなく、受信したリクエストごとにセッションを作成するのは非常に無駄な (そして DDoS 攻撃に対して脆弱) ようです。

以下のコードは非常に一般的ですが、私が言及しているような単純なシナリオを示しています。

index.xhtml:

<html>
    <body>
        <h:form id="login">
            <h:outputLabel for="username">Username</h:outputLabel>
            <p:inputText id="username" name="username" value="#{userController.username}"/>
            <h:outputLabel for="password">Password</h:outputLabel>
            <p:password id="password" name="password" value="#{userController.password}"/>

            <p:commandButton id="loginButton" value="login" action="#{loginController.login}"/>
        </h:form>
    </body>
</html>

LoginController.java

@ViewScoped
public class LoginController implements Serializable {

    String username;
    String password;

    public void login(){
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if (request.getSession(false) == null){
            System.out.println("No session.");
        } else {
            System.out.println("Session already exists.");
        }

        try {
            request.login(username, password);
        } catch (ServletException e) {
            FacesContext.getCurrentInstance.addMessage(null, new FacesMessage("Login failure", e.getMessage()));
        }
    }

    // username and password getters/setters

}

編集:シャンボリックコードの例が修正されました

4

1 に答える 1

8

まず第一に、あなたのテスト方法論は完全に間違っています。

if (request.getSession() == null){
    System.out.println("No session.");
} else {
    System.out.println("Session already exists.");
}

引数のないメソッドのjavadocをよく読んでくださいgetSession()二度と戻らないことに気付くでしょうnull

具体的な問題に戻ると、デフォルトでは、JSF ビューステートをそこに保存する必要があるため、JSF は実際にセッションを自動作成します。JSF 状態保存メソッドをclientではなく に設定するserverと、セッションに保存されないため、セッションを作成する必要はありません。

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

今後の JSF 2.2 では、代わりに Bean をリクエスト スコープに入れて、<f:view transient="true">完全にステートレスにすることもできます。これは、Mojarra 2.1.19 以降でのみ利用可能な現在の JSF 2.1 バージョン用です。たとえば、Mojarra 開発者の 1 人によるこのブログも参照してください。

于 2013-02-12T14:06:50.417 に答える