我們目前正在爲來自應用程序的每個響應添加頭文件。爲了添加這些頭文件,我們使用Servlet API Filter
-interface。根據該文件,這表明了以下工作順序Java Servlet過濾器:我必須在傳遞到鏈之前添加頭文件,文檔告訴其他方式
public class SecurityFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
chain.doFilter(request, response);
HttpServletResponse httpServletResponse = ((HttpServletResponse) response);
httpServletResponse.addHeader("X-Frame-Options", "DENY");
httpServletResponse.addHeader("X-Content-Type-Options", "nosniff");
}
@Override
public void destroy()
{
}
}
這(特別是doFilter
- 方法)實施正確:
我們有以下過濾器在我們的應用
- 檢查請求
- (可選)使用自定義實現包裝請求對象以過濾輸入的內容或標頭f iltering
任選地包住響應對象與自定義實現來過濾內容或標題爲輸出濾波
- 要麼使用FilterChain對象調用下一個實體在鏈(chain.doFilter()),
- 或不能在請求/響應對傳遞到下一個實體在過濾器鏈,以阻止請求處理在過濾器鏈中的下一個實體的調用之後的響應
- 直接設置標頭。
據我們可以看到,我們的doFilter
- 方法的順序根據文檔(請求傳遞給鏈先下點4作爲說明,事後添加自定義標題是正確的點下的規定5)。但是,我們添加的標題在響應中不可見。如果我們改變爲了以下,一切似乎工作得很好:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse httpServletResponse = ((HttpServletResponse) response);
httpServletResponse.addHeader("X-Frame-Options", "DENY");
httpServletResponse.addHeader("X-Content-Type-Options", "nosniff");
chain.doFilter(request, response);
}
任何人都可以解釋這種行爲?
是否有任何其他過濾器? –
@EvanKnowles有。我認爲這是問題的一部分,因爲Nikos Paraskevopoulos指出下面的另一個過濾器很可能會提出請求。 –