gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:05:34 25 4
gpt4 key购买 nike

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

最佳答案

这确实是完全预料之中的。许多服务器在重启时保存和恢复 session ,以便最终用户可以继续他们的网站 session 。这是通过 Java 序列化实现的。这也正是 session 作用域 bean 需要实现 Serializable 的原因。 .

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

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

  2. 去掉Serializable类中的接口(interface)声明。这样他们将无法在服务器重启时恢复。

  3. 告诉 Tomcat 在服务器重启时不要恢复 session 。编辑 context.xml添加 <Manager> pathname 为空的元素到 <Context>元素。

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

另见:

关于jsf - 为什么即使在服务器重新启动后我的应用程序的值仍会保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com