Извлечь атрибуты запроса из запроса контейнера из Джерси

HttpServletRequest имеет метод:

setAttribute

Как извлечь этот атрибут из ContainterRequest?

Я не нашел: getAttribute метод!

код

public class AuthenticationFilter implements Filter{

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest httpReq = (HttpServletRequest) servletRequest;
      .... ....
      httpReq.setAttribute("businessId", businessId);
    }
}

В фильтре Джерси:

private class Filter implements ResourceFilter, ContainerRequestFilter{
   public ContainerRequest filter(ContainerRequest request) {
      ..extract the attribute from the httpReq
    }
}

Ответы

Ответ 1

Вы не можете. Они не подвергаются воздействию API Джерси. Если вы ищете кодовую базу Джерси, вы обнаружите, что нет использования HttpServletRequest.getAttributeNames(), которое вы ожидаете использовать, если они копируются в массовом порядке. Вы также обнаружите, что существует только несколько применений HttpServletRequest.getAttribute(), и это строго для внутренней бухгалтерии.

Обратите внимание, однако, что при развертывании в контексте сервлета JAX-RS позволяет вам вводить исходный HttpServletRequest с помощью аннотации @Context. Я не уверен, можете ли вы сделать это в фильтре Джерси, но он работает в MessageBodyReaders/Writers и в классах ресурсов.

Обновление: Я проверил, и вы можете на самом деле ввести HttpServletRequest в Jersey ContainerRequestFilter, просто включив:

@Context private HttpServletRequest httpRequest;

Ответ 2

Я получил работу @Context, но проблема в том, что мой ContainerRequestFilter является singleton.

Мне пришлось реализовать пользовательский javax.servlet.Filter и использовать ThreadLocal для хранения HttpServletRequest.

Ответ 3

Я хотел добавить к предыдущим ответам мое решение, помимо добавления контекста:

@Context
private HttpServletRequest httpRequest;

Вы должны set и get атрибуты из сеанса, Get:

 httpRequest.getSession().setAttribute("businessId", "yourId");

Set:

Object attribute = httpRequest.getSession().getAttribute("businessId");