2013-03-23 86 views
1

我有一個過濾器,我使用的是Spring的delegatingFilterProxy來攔截傳入的Web服務請求。取決於是否設置了一個標記,我想允許請求繼續,否則我想設置一個請求頭,當由端點檢查時將指示是否允許請求繼續。我想將代碼放在過濾器中以抽象檢查標誌的邏輯。在DelegatingFilterProxy中設置HTTP頭

我該如何修改過濾器中的請求頭(簡單的代碼示例會很棒),這是可以接受的做法,還是應該從過濾器發送響應,而不是將決策推送到端點?

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
if(somecondition) 
    set request header and forward to endpoint 
else 
    forward to endpoint without extra header 

感謝

回答

2

你需要創建一個FakeRequest來解決它

FakeHeadersRequest

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 

public class FakeHeadersRequest extends HttpServletRequestWrapper { 

    private Map<String, List<String>> headers = new HashMap<String, List<String>>(); 

    public FakeHeadersRequest(HttpServletRequest request) { 
     super(request); 
    } 

    @Override 
    public String getHeader(String name) { 
     if (headers.containsKey(name)) { 
      return headers.get(name).get(0); 
     } 

     return super.getHeader(name); 
    } 

    public void addHeader(String header, String value) { 
     List<String> list = headers.get(header); 
     if (list == null) { 
      list = new ArrayList<String>(); 
      headers.put(header, list); 
     } 
     list.add(value); 
    } 

    public void setHeader(String header, String value) { 
     List<String> list = new ArrayList<String>(); 
     headers.put(header, list); 
     list.add(value); 
    } 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    @Override 
    public Enumeration getHeaderNames() { 
     List<String> list = new ArrayList<String>(); 

     HttpServletRequest request = (HttpServletRequest) getRequest(); 
     Enumeration<String> e = request.getHeaderNames(); 
     while (e.hasMoreElements()) { 
      list.add(e.nextElement()); 
     } 

     list.addAll(headers.keySet()); 

     return Collections.enumeration(list); 
    } 
} 

FakeHeaderFilter

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 

public class FakeHeaderFilter implements Filter { 
    public void init(FilterConfig filterConfig) { 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     boolean condition = false; 
     if (condition && request instanceof HttpServletRequest) { 
      FakeHeadersRequest req = new FakeHeadersRequest(
        (HttpServletRequest) request); 
      req.setHeader("new-header", "some-value"); 
      chain.doFilter(req, response); 
     } else { 
      chain.doFilter(request, response); 
     } 

    } 

    public void destroy() { 
    } 

} 

而且refer this

+0

謝謝,這是我需要的。奇怪的是,當我設置標題時,只有標題名稱在我的球衣類中可用。 – cduggan 2013-03-23 15:35:24

1

請求屬性更適合於此目的ServletRequest.get/setAttribute()。你有什麼理由不能使用它們嗎?

+0

這很有幫助,但我需要能夠訪問標題內容 – cduggan 2013-03-23 15:39:21