2010-09-29 68 views

回答

1

這取決於您要使用的語言和Web服務框架。

您的問題標題提到「Servlet Filter」,因此我假設您使用Java應用程序容器。如果您的ws框架不支持將映射請求標頭支持到值對象中,則可以使用處理標頭的Servlet過濾器,並將信息存儲在稍後可以檢索的地方。最好的選擇是把它放在請求屬性中。如果你以後不能進入HttpServletRequest(這可能會讓你問這個問題),你可以將它存儲到一個ThreadLocal變量中,但這很棘手。

我給你一個小例子:

import java.io.IOException; 

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 Filter implements javax.servlet.Filter { 
    public ThreadLocal<String> local; 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse response, 
    FilterChain chain) throws ServletException, IOException { 

    HttpServletRequest request = (HttpServletRequest)req; 
    String bar = request.getHeader("foo"); 
    local.set(bar); 
    // you can now retrieve the header value in your code with Filter.local.get() 
    try { 
     chain.doFilter(request, response); 
    } finally { 
     local.remove(); // clean up 
    } 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    local = new ThreadLocal<String>(); 
    } 
} 

它的工作原理,但在現實生活中實現你應該保存自己的類的ThreadLocal的一個對象(例如一個Bean),而不是一個單純的串。您應該考慮將ThreadLocal變量放在Filter的外部(例如,將其作爲靜態變量放在更合理的位置)。

+1

我實際上是通過使用@WebServiceContext註解來解決這個問題的,因爲我使用的是JAX-WS – GLL 2010-10-21 18:15:26

相關問題