1

小さなアプリケーションに2 つ@SessionScopedの Bean があります。サーバーをクリーンアップして再起動しても、すべてのフォーム値が保持されます。

@ManagedBean(name = "bill")
@SessionScoped
public class Bill implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static final String MANAGED_BEAN_NAME = "bill";

/**
     * @return the current instance of Bill
     */
    public static Bill getCurrentInstance() {
        return (Bill) FacesContext.getCurrentInstance().getExternalContext()
                .getSessionMap().get(MANAGED_BEAN_NAME);
    }
//other methods
}

@ManagedBean
@SessionScoped
public class TailorTip implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private Bill bill;
private Participants[] participants;
private Integer participantIndex;

@PostConstruct
public void init() {
    bill = Bill.getCurrentInstance();
}

//other methods
}

値の保持を回避するにはどうすればよいですか? 注:Tomcatを使用しています。

4

2 に答える 2

3

これは確かに完全に予想されます。多くのサーバーは、再起動時にセッションを保存および復元するため、エンドユーザーは Web サイト セッションを続行できます。これは、Java シリアライゼーションによって実現される隠れたものです。これがまさに、セッション スコープ Bean を実装する必要がある理由でもありますSerializable

解決策については、これを修正する方法がいくつかあります。

  1. ジョブの適切なスコープに Bean を配置します。それらをセッションスコープにする必要があると確信していますか? 結局のところ、ビュー スコープはそれらの Bean により適しているのではないでしょうか? 通常、セッション スコープは、ログイン ユーザーやその設定などのクライアント固有の情報にのみ使用され、フォーム データには使用されません。サーバーを再起動するたびにそれらをクリアすることが明らかに緊急に必要であることは、セッションスコープが間違った選択であることを裏付けています。適切な Bean スコープを選択する方法も参照してください。

  2. Serializableクラス内のインターフェイス宣言を取り除きます。この方法では、サーバーの再起動時に復活できません。

  3. サーバーの再起動時にセッションを復活させないように Tomcat に指示します。要素に空の要素をcontext.xml追加するように編集します。<Manager>pathname<Context>

    <Context ... >
        <Manager pathname="" />
    </Context>
    

以下も参照してください。

于 2013-10-01T11:00:03.390 に答える