Передать информацию запроса из фильтра сервлетов в веб-службу - PullRequest
1 голос
/ 29 сентября 2010

Мне нужно получить некоторую информацию, отправленную в заголовках HTTP из веб-службы.Как мне этого добиться?

1 Ответ

1 голос
/ 05 октября 2010

Это зависит от языка и структуры веб-службы, которую вы хотите использовать.

В заголовке вашего вопроса упоминается "Фильтр сервлета", поэтому я предполагаю, что вы работаете с контейнером приложения Java.Если ваш ws-фреймворк не поддерживает отображение заголовков запросов в объекты-значения, вы можете использовать фильтр сервлетов, который обрабатывает заголовок и сохраняет информацию там, где вы можете получить ее позже.Лучший вариант - поместить его в атрибут запроса.Если вы не можете добраться до 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) вместо простой String.Вам следует рассмотреть возможность размещения переменной ThreadLocal за пределами вашего фильтра (например, в качестве статической переменной где-то в более логичном месте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...