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

Jsf 为什么即使在服务器重新启动后,我的应用程序的值仍然保留?,jsf,tomcat,Jsf,Tomcat,我的小应用程序中有2个@SessionScopedbean。即使在重新启动clean服务器时,所有表单值都会保留 @ManagedBean(name = "bill") @SessionScoped public class Bill implements Serializable { /** * */ private static final long serialVersionUID = 1L; private static final Stri

我的小应用程序中有2个
@SessionScoped
bean。即使在重新启动clean服务器时,所有表单值都会保留

@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。

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

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

这确实是意料之中的事。许多服务器在重新启动时保存和恢复会话,以便最终用户可以继续其网站会话。这是通过Java序列化实现的。这也是会话范围的bean需要实现
Serializable
的原因

至于解决方案,有几种方法可以解决此问题:

  • 将bean放在作业的正确范围内。您是否绝对确定它们需要在会话范围内?毕竟,视图范围不是更适合这些bean吗?会话范围通常仅用于特定于客户端的信息,如登录用户、其首选项等,因此不用于表单数据。在每次服务器重新启动时,您显然迫切需要清除它们,这证实了会话范围是错误的选择。另见

  • 去掉类中的
    Serializable
    接口声明。这样,在服务器重新启动时,它们将无法恢复

  • 告诉Tomcat不要在服务器重启时恢复会话。编辑
    context.xml
    元素添加路径名为空的
    元素

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

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

        至于解决方案,有几种方法可以解决此问题:

      • 将bean放在作业的正确范围内。您是否绝对确定它们需要在会话范围内?毕竟,视图范围不是更适合这些bean吗?会话范围通常仅用于特定于客户端的信息,如登录用户、其首选项等,因此不用于表单数据。在每次服务器重新启动时,您显然迫切需要清除它们,这证实了会话范围是错误的选择。另见

      • 去掉类中的
        Serializable
        接口声明。这样,在服务器重新启动时,它们将无法恢复

      • 告诉Tomcat不要在服务器重启时恢复会话。编辑
        context.xml
        元素添加路径名为空的
        元素

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

        我使用Tomcat。知道我在哪里能做到你刚才说的吗?我用Tomcat。你知道我在哪里能做到你刚才说的吗?