将请求信息从Servlet过滤器传递到Web服务

时间:2010-09-29 18:05:03

标签: web-services http-headers

我需要从Web服务中检索HTTP头中发送的一些信息。我怎样才能做到这一点?

1 个答案:

答案 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之外(例如,在更合理的位置作为静态变量)。