首頁>Program>source

我要設置 Expires 所有 image/*的標题 和 text/css .我在 Filter中這樣做 .但是:

  • before calling chain.doFilter(..) 內容型別尚未"實現"
  • 致電 chain.doFilter(..)之後 設置了Content-type,但是設置了content-length,它禁止添加新的標頭(至少在Tomcat實現中)

我可以使用所請求資源的擴充套件名,但是由於某些css檔案是由richfaces通過从jar檔案內部获取而生成的,因此檔案名不是 x.css ,但是是 /xx/yy/zz.xcss/DATB/...

因此,有一種方法可以在提交响應之前获取Content-type。

最新回復
  • 12天前
    1 #

    是的,實現 HttpServletResponseWrapper 並覆盖 setContentType()

    class AddExpiresHeader extends HttpServletResponseWrapper {
        private static final long ONE_WEEK_IN_MILLIS = 604800000L;
        public AddExpiresHeader(HttpServletResponse response) {
            super(response);
        }
        public void setContentType(String type) {
            if (type.startsWith("text") || type.startsWith("image")) {
                super.setDateHeader("Expires", System.currentTimeMillis() + ONE_WEEK_IN_MILLIS);
            }
            super.setContentType(type);
        }
    }
    

    並按如下所示使用它:

    chain.doFilter(request, new AddExpiresHeader((HttpServletResponse) response));
    

  • 12天前
    2 #

    您應该將HttpServletResponsewrapper子類化,並重寫addHeader和setHeader,以在將" Content-Type"作為標题名稱傳入時添加新的所需標题.確保不要忘記在那些被覆盖的方法中也呼叫super.使用此新包裝器包裝在doFilter方法引數中發送的响應,並將包裝器傳遞给對doFilter的呼叫。

  • javascript:windoweventkeyCode如何在Firefox上執行此操作?
  • java:正確關闭SSLSocket