1
我需要從Web服務中檢索HTTP頭中發送的一些信息。我怎樣才能做到這一點?從Servlet過濾器向Web服務傳遞請求信息
我需要從Web服務中檢索HTTP頭中發送的一些信息。我怎樣才能做到這一點?從Servlet過濾器向Web服務傳遞請求信息
這取決於您要使用的語言和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的外部(例如,將其作爲靜態變量放在更合理的位置)。
我實際上是通過使用@WebServiceContext註解來解決這個問題的,因爲我使用的是JAX-WS – GLL 2010-10-21 18:15:26