我的小应用程序中有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。
答案 0 :(得分:3)
这确实是完全可以预期的。许多服务器在重新启动时保存和恢复会话,以便最终用户可以继续他们的网站会话。这是Java序列化实现的。这也正是会话范围bean需要实现Serializable
的原因。
关于解决方案,有几种方法可以解决这个问题:
将bean放在正确的作业范围内。你绝对确定他们需要成为会话范围的吗?毕竟,视图范围是否更适合那些bean?会话范围通常仅用于特定于客户端的信息,例如登录用户,其首选项等,因此不用于表单数据。您明显迫切需要在每次重启服务器时清除它们,确认会话范围是错误的选择。另请参阅How to choose the right bean scope?
在类中删除Serializable
接口声明。这样,他们将无法在服务器重启时恢复。
告诉Tomcat不要恢复服务器重启的会话。修改context.xml
,将<Manager>
元素与空pathname
元素添加到<Context>
元素。
<Context ... >
<Manager pathname="" />
</Context>
答案 1 :(得分:2)
如果它们是会话作用域,则许多服务器会在重新启动时保留会话信息。如果重新部署应用程序,则将清除该信息。但只是重新启动应用程序将不会重置它。您必须查阅服务器文档以禁用服务器重新启动时的会话持久性。