2016-09-14 49 views
-1

這是我的篩選:Servlet過濾器:如何從HttpServletResponse獲取所有標題?

public class SimpleFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 
     // where is the httpResponse.getHeaderNames()? 
     chain.doFilter(request, response); 
    } 

    @Override 
    public void destroy() {} 

} 

我使用的Servlet 2.5

我可以設置一個標題,驗證響應中是否存在某個標題,但我無法獲取所有標題。在HttpServletRequest中存在此方法(httpServletRequest.getHeaderNames())。

那麼,HttpServletResponse中的getHeaderNames()等價於哪裏?

謝謝!

+1

你使用的是什麼版本的Servlet API?這個方法在3.0中是正確的(http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletResponse.html#getHeaderNames--)(有一些限制)。 –

+0

我猜你已經忘了將'ServletResponse'強制轉換成'HttpServletResponse' –

+0

@SotiriosDelimanolis,2.5 :(我將在這個問題中加入這個信息。 – Dherik

回答

0

這真是奇怪......它似乎有一個在2.5 API沒有訪問這個(見的javadoc here

作爲一種變通方法,您可以使用過濾器來包裝它有一個getter的包裝響應(確保包裝過濾器在其他任何事情之前運行)。

public class MyResponseWrapper extends HttpServletResponseWrapper { 
    private Set<String> headerNames = new HashSet<String>(); 

    public MyResponseWrapper(HttpServletResponse delegate) { 
     super(delegate); 
    } 

    public void addHeader(String name, String value) { 
     super.addHeader(name, value); 
     headerNames.add(name); 
    } 

    public Set<String> getHeaderNames() { 
     return Collections.immutableSet(headerNames); 
    } 
} 


public class WrapperFilter implements Filter { 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, new MyResponseWrapper(response)); 
    } 
} 

然後你可以再打電話的地方往下((MyResponseWrapper) response).getHeaderNames()行。我意識到這有點hacky :)