2011-04-27 67 views
0

我們有一個在Glassfish 3.1上運行的帶有JSF 2.0的Java EE 6 Web應用程序。在Glassfish上爲JSF Web應用程序強制特定響應標頭

在那裏我們遇到了一個奇怪的bug:Glassfish發送給客戶端的響應頭的Mime類型取決於瀏覽器發送的請求頭中允許的MIME類型的順序。因此,在某些情況下(取決於瀏覽器),響應的MIME類型錯誤,導致HTML頁面出現故障。 但解釋這件事需要相當長的時間。因此,要解決此問題,我們現在只想做一件事:

強制整個Web應用程序的響應標題類型爲「text/html」。

目前,我們做到這一點與在web.xml配置了Servlet過濾器:

@WebFilter("/BaseFilter") 
public class BaseFilter implements Filter { 
    public BaseFilter() { 
    } 

    public void destroy() { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
          FilterChain chain) throws IOException, ServletException { 
     response.setContentType("text/html;charset=UTF-8"); 
     chain.doFilter(request, response); 
    } 

    public void init(FilterConfig fConfig) throws ServletException { 
    } 
} 

配置在web.xml:

<filter> 
    <filter-name>BaseFilter</filter-name> 
    <filter-class>com.company.web.filter.BaseFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>BaseFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <!-- these patterns should match cached resources --> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

所以我的問題是,是否有更好的辦法強制執行特定的響應頭,特別是通過配置它而不是實現ServletFilter?

是否有Glassfish選項可以做到這一點?

+1

返回的是什麼? Facelets默認爲'text/html',只有字符集可能因服務器/客戶端的細節而異。至於過濾方法,你不想發送帶有該內容類型的JS/CSS /圖像文件。而是映射到JSF servlet的''而不是'/ *'的''。 – BalusC 2011-04-27 18:15:27

+0

「Facelets默認爲text/html,只有字符集可能因服務器/客戶端詳細信息而異」。在我們的應用程序中,響應標頭會有所不同,具體取決於請求標頭中允許的Mime類型的順序。它看起來不同(是否borken),取決於瀏覽器(它的text/html或其application/xhtml,它打破了渲染)。所以我們想強制它爲text/html。感謝關於JS/CSS的提示,我們將改變它以僅過濾JSF Servlet。 – ifischer 2011-04-27 18:20:32

+0

嗯,聽起來更像是瀏覽器的錯誤,它說它更喜歡'application/xhtml',但無法正確呈現它。 – BalusC 2011-04-27 18:34:45

回答

0

您可以在<f:view>contentType屬性的默認模板中指定它。

<f:view contentType="text/html"> 
相關問題