有关Struts2a的ction直接使用response异步问题
假設我們在項目中使用struts2,正在使用ajax而通信時后端程序。為簡單起見,我們經常使用下面的方法:
? ? ? ??ActionContext ac = ActionContext.getContext();
? ? ? ? HttpServletResponse response = (HttpSevletResponse)ac.get(StrutsStatics.HTTP_RESPONSE);
response.setContentType("text/html;charset=utf-8");
try {
PrintWriter pw = response.getWriter();
pw.print(data);
} catch(IOException e) {
? e.printStackTrace();
}
以上的方法實際上是存在一個漏洞的。
由于這個破壞了struts2運行的完整性,在程序運行過程中可能會出現運行步驟顛倒的問題。當然了這樣的方式帶來的其它問題比方和servlet耦合等問題不是這里要討論的。比方存在下面的一個場景:我們前端頁面中使用ajax和后臺進行通信。獲取后臺數據后。依據這個數據來訪問程序中其它的URL路徑。
如今我們在web.xml中配置我們自己的Filter,這個Filter在struts2運行之前記下“開始運行”的日志。在Struts2運行完成之后再記下“結束運行”的日志。
嚴格意義上正確的運行順序是:
? ? ? ? 1)我們的Filter打印日志“開始執行”;
? ? ? ? 2)Struts2運行完成返回數據給client;
? ? ? ? 3)我們的Filter打印日志“結束執行”;
? ? ? ? 4)ajax依據結果進行第二次訪問。
? ? ? ? 可是假設我們採用上邊的方式運行,則可能出現這樣的順序:
? ? ? ? ?1)我們的Filter打印日志“開始執行”;
? ? ? ? ?2)Struts2運行完成返回數據給client。
? ? ? ? ?3)ajax依據結果進行第二次訪問;
? ? ? ? ?4)我們的Filter打印日志“結束執行”;
? ? ? ? ?原因可能是我們調用response的Writer返回數據給client時,會新開一個線程來完畢這個工作,而struts2在繼續完畢其它的工作.某些情況下response的工作在struts2完畢之前就完畢了和client的交互,(比方使用struts2的result攔截器完畢的工作比較耗時)。假設在正常流程中的第4)步會依賴第3)步的操作。比方完畢設置數據到session。在苛刻的環境中第4)步訪問過來了。結果第3)步仍然沒有設置完畢(比方我們包裝了request來解決分布式session的問題,由于分布式緩存來緩存session。假設session比較大或者嵌套比較復雜會比較耗時的情況下)就會出問題。
? ? ? ? ?因此。在struts2一定要慎重直接使用response來完畢一些操作。
? ? ? ? ?解決的方法。能夠使用struts2自回到自己json數據或二進制的方式將這些工作全部完成。
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
轉載于:https://www.cnblogs.com/mfrbuaa/p/4718051.html
總結
以上是生活随笔為你收集整理的有关Struts2a的ction直接使用response异步问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Service简介
- 下一篇: php header运用细节