2013-02-12 12 views
6

JSFでは、セッションがの前に作成され、のログインに成功したようです。つまり単にログインページを要求すると、新しいセッションが作成される。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 

} 

編集:すべての

答えて

8

まず固定shambolicコード例では、あなたのテスト方法は完全に間違っています。

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

慎重引数なしgetSession()方法のjavadocをお読みください。 は決して、返信はnullとなります。

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

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

あなたは、代わりに、リクエストスコープに豆を入れて、完全にステートレス行くために<f:view transient="true">を使用することができます。これは、Mojarra 2.1.19以降でのみ使用可能な現行のJSF 2.1バージョン用です。例えば、 Mojarra開発者の一人からのthis blog

+0

告白 - サンプルコードは、生産コードから大幅に変更されました。私はもともとgetSession(false)を使用していました。しかしそれを除いて、私が思ったことを確認してくれてありがとう。私はJSFがセッションを自動作成したことを明白に確認していませんでした(本、ブログ、Oracleのドキュメント)。 – MMeldrum

+0

これは、(ログイン資格情報がなくても)新しいログイン要求をサーバーに適用してサーバーを停止させることを実際には容易にしますか? – MMeldrum

+0

サーバーのハードウェアと構成によって異なります。例えば。接続/要求プーリング、セッションタイムアウト、使用可能メモリ、ネットワーク帯域幅などが含まれます。 – BalusC

関連する問題