为什么即使在服务器重启后我的应用程序的值仍然保留?

时间:2013-10-01 03:58:45

标签: jsf tomcat

我的小应用程序中有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。

2 个答案:

答案 0 :(得分:3)

这确实是完全可以预期的。许多服务器在重新启动时保存和恢复会话,以便最终用户可以继续他们的网站会话。这是Java序列化实现的。这也正是会话范围bean需要实现Serializable的原因。

关于解决方案,有几种方法可以解决这个问题:

  1. 将bean放在正确的作业范围内。你绝对确定他们需要成为会话范围的吗?毕竟,视图范围是否更适合那些bean?会话范围通常仅用于特定于客户端的信息,例如登录用户,其首选项等,因此不用于表单数据。您明显迫切需要在每次重启服务器时清除它们,确认会话范围是错误的选择。另请参阅How to choose the right bean scope?

  2. 在类中删除Serializable接口声明。这样,他们将无法在服务器重启时恢复。

  3. 告诉Tomcat不要恢复服务器重启的会话。修改context.xml,将<Manager>元素与空pathname元素添加到<Context>元素。

    <Context ... >
        <Manager pathname="" />
    </Context>
    
  4. 另见:

答案 1 :(得分:2)

如果它们是会话作用域,则许多服务器会在重新启动时保留会话信息。如果重新部署应用程序,则将清除该信息。但只是重新启动应用程序将不会重置它。您必须查阅服务器文档以禁用服务器重新启动时的会话持久性。