此解决方案会导致视图中所有按钮的闩锁,因此如果正在下载并且我按下任何按钮,则此请求将被丢弃。这基本上有效,但我仍然有一些崩溃,但我认为这与另一个问题有关。
在我开始的下载方法中,我向当前会话添加了一个标志:
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
session.setAttribute("DOWNLOAD_IN_PROGRESS", "true");
在下载方法结束时,我将此标志设置为 false ...
session.setAttribute("DOWNLOAD_IN_PROGRESS", "false");
在阶段监听器(已添加到 faces-config)中,我检查当前是否正在进行下载。如果是,则丢弃该请求。
@Named
@Logged
public class DownloadLatchPhaseListener implements PhaseListener
{
private static final long serialVersionUID = -8603272654541248512L;
@Override
public void beforePhase(PhaseEvent event)
{
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
if (session != null && "true".equals(session.getAttribute("DOWNLOAD_IN_PROGRESS")))
{
FacesContext.getCurrentInstance().responseComplete();
}
}
@Override
public void afterPhase(PhaseEvent event)
{
// not used
}
@Override
public PhaseId getPhaseId()
{
return PhaseId.RESTORE_VIEW;
}
}