第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

是否可以手動(dòng)緩存整個(gè)網(wǎng)頁?

是否可以手動(dòng)緩存整個(gè)網(wǎng)頁?

繁花如伊 2023-06-14 14:42:05
我需要緩存一個(gè)網(wǎng)頁,然后為了將來的請(qǐng)求,檢查緩存(使用 url 作為鍵),如果找到,則從緩存中返回網(wǎng)頁而不是發(fā)出請(qǐng)求。我正在使用 Smiley 的 ProxyServlet,servlet 寫入 OutputStream 的方法似乎非常適合緩存。我只添加了兩行代碼:/** * Copy response body data (the entity) from the proxy to the servlet client. * TODO: CACHE entity here for retrieval in filter */protected void copyResponseEntity( HttpResponse proxyResponse, HttpServletResponse servletResponse,        HttpRequest proxyRequest, HttpServletRequest servletRequest ) throws IOException{    HttpEntity entity = proxyResponse.getEntity();    if ( entity != null )    {        String key =  getCurrentUrlFromRequest( servletRequest );  // 1        basicCache.getCache().put( key, proxyResponse.getEntity() ); // 2        OutputStream servletOutputStream = servletResponse.getOutputStream();        entity.writeTo( servletOutputStream );    }}它有點(diǎn)管用,它確實(shí)將 HttpEntity 存儲(chǔ)在緩存中。但是當(dāng)我返回到瀏覽器并再次請(qǐng)求相同的 url 時(shí),當(dāng)代碼返回到我的過濾器中時(shí),我使用 url 作為鍵獲得了 HttpEntity,并將其寫入響應(yīng),但是我得到了一個(gè)“Stream closed “ 錯(cuò)誤:java.io.IOException: Stream closed    at java.base/java.util.zip.GZIPInputStream.ensureOpen(GZIPInputStream.java:63) ~[na:na]    at java.base/java.util.zip.GZIPInputStream.read(GZIPInputStream.java:114) ~[na:na]    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:na]    at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:64) ~[httpclient-4.5.9.jar:4.5.9]    at org.apache.http.client.entity.DecompressingEntity.writeTo(DecompressingEntity.java:93) ~[httpclient-4.5.9.jar:4.5.9]    at com.myapp.test.foo.filters.TestFilter.doFilter(TestFilter.java:37) ~[classes/:na]我堅(jiān)持使用這種非常本地化的/手動(dòng)的/任何您想稱之為緩存的東西——我不能使用明顯的“只需連接 ehcache/redis/任何東西并讓它做它的事情”。因此,雖然我知道那些優(yōu)秀的緩存可以緩存整個(gè)網(wǎng)頁,但我不知道它們是否允許我以這種公認(rèn)的不尋常方式工作。所以我希望 SO 可以告訴我如何完成這項(xiàng)工作。我首先嘗試在 ConcurrentHashMap 中連接我的基本緩存,但這也不起作用,所以我想看看我是否可以利用大型緩存槍所擁有的任何魔力,但到目前為止我不能。
查看完整描述

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)閉編寫器。


查看完整回答
反對(duì) 回復(fù) 2023-06-14
?
慕桂英546537

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


查看完整回答
反對(duì) 回復(fù) 2023-06-14
?
明月笑刀無情

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 );

? ? }

感謝大家的幫助!


查看完整回答
反對(duì) 回復(fù) 2023-06-14
  • 2 回答
  • 0 關(guān)注
  • 224 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)