このソリューションにより、ビュー内のすべてのボタンがラッチされるため、ダウンロードが進行中でボタンを押すと、この要求は破棄されます。これは基本的には機能しますが、まだクラッシュすることがありますが、これは別の問題に関連していると思います。
最初のダウンロード方法で、現在のセッションにフラグを追加します。
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;
}
}