我有一個使用StreamResult來傳輸文件的Struts2動作。該文件是一個非常大的報告。我想設置一個標誌來限制用戶一次下載一次。在我的操作中,我可以設置標誌,但是當流完成時我沒有空位來解除它。用Struts2一次下載
在Struts之前,我會設置標誌,寫入Servlet的OutputStream,然後取消設置標誌。但是對於Struts,Action只是將流設置爲一個變量,然後Action就完成了。 Struts(在struts.xml中設置)然後在我的控制之外的地方進行發送。
我有一個使用StreamResult來傳輸文件的Struts2動作。該文件是一個非常大的報告。我想設置一個標誌來限制用戶一次下載一次。在我的操作中,我可以設置標誌,但是當流完成時我沒有空位來解除它。用Struts2一次下載
在Struts之前,我會設置標誌,寫入Servlet的OutputStream,然後取消設置標誌。但是對於Struts,Action只是將流設置爲一個變量,然後Action就完成了。 Struts(在struts.xml中設置)然後在我的控制之外的地方進行發送。
我想你應該創建一個攔截器來封裝這個下載動作,並且它可以鎖定/解鎖當前用戶的訪問。有關更多信息,請參閱http://struts.apache.org/2.x/docs/interceptors.html。在FileInputStream
類
嘗試超越close
功能,這裏是FileInputStream API的文檔,如果你使用的是另一種「輸入流」的,你只是擴展它,並覆蓋close
方法。
試試這個代碼:
public class YourInputStream extends FileInputStream {
@Override
public void close() throws IOException{
super.close();
// here unset your flag
}
}
在動作類:
inputStream = new YourInputStream(new File(path));
+1這可能是最簡單的。另一種方法是創建一個自定義結果類型。但是如果你仔細想想,這真的不是一個好主意,因爲你的行動已經完成了所有的工作,然後它會期望渲染視圖(返回流),但不能這樣做,或者它將不得不等待......總之,儘可能快地返回可能的錯誤信息。 – Quaternion
你是什麼意思,行動已經完成了這項工作?如果用戶擁有鎖定,則可以在動作開始之前進行檢查,然後根本不執行動作。 – Zagrev
「另一種方法會」......我之後說的所有事情都與如果有人試圖將解決方案作爲自定義結果類型實施而不是攔截器相關。 – Quaternion