簡體   English   中英

如何根據Content-type添加響應頭; 在提交響應之前獲取Content-type

[英]How to add response headers based on Content-type; getting Content-type before the response is committed

我想為所有image/*text/css設置Expires標頭。 我在Filter這樣做。 然而:

  • 在調用chain.doFilter(..) ,Content-type尚未“實現”
  • 在調用chain.doFilter(..) ,設置了Content-type,但是content-length也是如此,它禁止添加新的頭文件(至少在Tomcat實現中)

我可以使用所請求資源的擴展,但由於某些css文件是由richfaces通過從jar文件中獲取而生成的,因此文件的名稱不是x.css ,而是/xx/yy/zz.xcss/DATB/...

那么,有沒有辦法在提交響應之前獲取Content-type。

是的,實現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));

您應該繼承 HttpServletResponseWrapper並覆蓋addHeadersetHeader,以便在將“Content-Type”作為標題名稱傳入時添加新需要的標題。 確保不要忘記在那些被覆蓋的方法中調用super。 用這個新的Wrapper包裝doFilter方法參數中發送的Response,並將Wrapper傳遞給對doFilter的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM