我需要从Web服务中检索HTTP头中发送的一些信息。我怎样才能做到这一点?
答案 0 :(得分:1)
这取决于您要使用的语言和Web服务框架。
您的问题标题提到“Servlet过滤器”,所以我假设您使用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)中存储你自己的Class的Object,而不仅仅是String。您应该考虑将ThreadLocal变量放在Filter之外(例如,在更合理的位置作为静态变量)。