2 回答

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

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

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