2015-11-09 56 views
2

我們如何從'HttpServletRequest'中刪除「授權標頭」。我們如何從'HttpServletRequest'中刪除「授權」標頭

我們有2個過濾器,在第一個過濾器之後,我們需要在請求傳遞給第二個過濾器之前從請求中刪除「Authorization」頭。我知道我們可以使用添加標題

HttpServletRequest req = (HttpServletRequest) request; 

    HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req); 

    //requestWrapper.addHeader("Authorization", "PPPPPPPP"); 

    requestWrapper.removeHeader("Authorization"); // Did not work 

    public void removeHeader(String name) { 
     headerMap.remove(name); 
    } 

但是我們如何刪除「授權」標題。

+1

凡'HeaderMapRequestWrapper'哪裏來的?這不是一個規範標準的類。 –

+0

公共類HeaderMapRequestWrapper擴展HttpServletRequestWrapper {} – eagerToLearn

回答

2

一個可行的辦法是包裝在一個自定義了HttpServletRequestWrapper原始請求將覆蓋getHeadergetHeadersgetHeaderNames方法:

request = new HttpServletRequestWrapper(request) { 
    private Set<String> headerNameSet; 

    @Override 
    public Enumeration<String> getHeaderNames() { 
     if (headerNameSet == null) { 
      // first time this method is called, cache the wrapped request's header names: 
      headerNameSet = new HashSet<>(); 
      Enumeration<String> wrappedHeaderNames = super.getHeaderNames(); 
      while (wrappedHeaderNames.hasMoreElements()) { 
       String headerName = wrappedHeaderNames.nextElement(); 
       if (!"Authorization".equalsIgnoreCase(headerName)) { 
        headerNameSet.add(headerName); 
       } 
      } 
     } 
     return Collections.enumeration(headerNameSet); 
    } 

    @Override 
    public Enumeration<String> getHeaders(String name) { 
     if ("Authorization".equalsIgnoreCase(name)) { 
      return Collections.<String>emptyEnumeration(); 
     } 
     return super.getHeaders(name); 
    } 

    @Override 
    public String getHeader(String name) { 
     if ("Authorization".equalsIgnoreCase(name)) { 
      return null; 
     } 
     return super.getHeader(name); 
    } 
}; 
1

它看起來像HeaderMapRequestWrapper的東西,你實現你自己,因爲它不是一個規範的標準,我可以找到關於這個類對谷歌的唯一事情是這樣的代碼示例:http://www.codegithub.com/watch?v=0NByHgxUxPPU

假設HeadermapRequestWrapper是一個類,你從該代碼示例中複製,只需添加一個removeHeader()方法。

public void removeHeader(String name) { 
    headerMap.remove(name); 
} 
+0

這正是我嘗試但不工作。讓我調試更多。感謝您的建議。 – eagerToLearn

+0

這將有助於向請求添加標題。 headerMap不包含所有的請求標頭。 – eagerToLearn