1

我的小应用程序中有 2 个@SessionScopedbean。即使我重新启动清理服务器,所有表单值都会保留。

@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

这确实是完全可以预料的。许多服务器在重启时保存和恢复会话,以便最终用户可以继续他们的网站会话。这是通过 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 回答
2

如果它们是会话范围的,那么许多服务器会在重新启动后保留会话信息。如果您重新部署应用程序,则信息将被清除。但简单地重新启动应用程序不会重置它。您必须查阅您的服务器文档以禁用跨服务器重新启动的会话持久性。

于 2013-10-01T04:03:23.663 回答