2 回答

TA貢獻1851條經驗 獲得超5個贊
課堂上TestFilter
,能不能在這一行下個斷點調試一下?
HttpEntity?page?=?(HttpEntity)?basicCache.getCache().get(?url?);
底層流可能不處于您實際執行的狀態:
page.writeTo(?servletOutputStream?);
本質上,聲明PrintWriter
您控制狀態,從緩存中獲取內容,寫入響應,然后關閉編寫器。

TA貢獻1848條經驗 獲得超10個贊
正如這里已經說過的, 應該在 HttpServletResponse.getOutputStream()/.getWriter() 上調用 .close() 嗎?
您最好為您的 servlet 實現一個包裝器,詳見下文。
https://www.oracle.com/technetwork/java/filters-137243.html#72674

TA貢獻1828條經驗 獲得超4個贊
我想知道為什么所有這些很好的答案都同意包裝 HttpServletResponse 而我無法讓它工作——我覺得自己像個白癡。它沒有用,因為對 wrap 的響應中沒有任何內容。
頁面內容從一開始就全部在 HttpEntity 中: HttpEntity entity = proxyResponse.getEntity();
在我意識到追逐 servlet 響應/請求不是答案之后,我很幸運地發現:org.apache.http.entity.BufferedHttpEntity
包裝一個 HttpEntity 以便您可以重復獲取內容),但是它是在正確的對象上進行的。
所以上面的第一個方法只是稍微調整了一下,它仍然代理得很好:
? ? if ( entity != null )
? ? {
? ? ? ? String key =? getCurrentUrlFromRequest( servletRequest );
? ? ? ? OutputStream servletOutputStream = servletResponse.getOutputStream();
? ? ? ? BufferedHttpEntity wrapper = new BufferedHttpEntity( entity );
? ? ? ? basicCache.getCache().put( key, wrapper );
? ? ? ? wrapper.writeTo( servletOutputStream );
? ? }
將 BasicCache 更改為期望一個 String 和一個 BufferedHttpEntity,然后對于后續請求,在過濾器中從緩存中獲取 BufferedHttpEntity,完成所有工作的行與上面的最后一行相同:
? ? if ( null != page )
? ? {? ? ? ? ? ?
? ? ? ? OutputStream servletOutputStream = servletResponse.getOutputStream();
? ? ? ? page.writeTo( servletOutputStream );? // bingo
? ? }
? ? else
? ? {
? ? ? ? filterChain.doFilter( servletRequest, servletResponse );
? ? }
感謝大家的幫助!
添加回答
舉報