Как перехватить запрос в течение жизненного цикла Джерси? - PullRequest
49 голосов
/ 05 декабря 2010

Я использовал Джерси в течение большей части года и только что наткнулся на проблему, на которую я не могу найти ответ: как вы перехватываете (или подключаетесь) жизненный цикл запроса Джерси?

В идеале, я мог бы выполнить некоторую пользовательскую фильтрацию / проверку / отклонение между временем, когда контейнер принимает запрос от сети, и временем, когда мои методы-обработчики вызываются. Бонусные баллы, если есть простой способ отфильтровать перехватчики по подпутям (например, иметь один перехватчик для чего-либо в /, другой для всего в / user / и т. Д.).

Спасибо!

Edit: чтобы быть более понятным, общая идея здесь заключается в том, чтобы иметь возможность написать некоторый код, который будет выполняться для многих вызовов API, без необходимости явного вызова этого кода из каждого метода-обработчика. Это уменьшит лишний код и избавит от необходимости передавать контексты запроса вокруг.

Ответы [ 4 ]

50 голосов
/ 06 декабря 2010

Я нашел ответ.

Сначала создайте класс, который реализует ContainerRequestFilter.Интерфейс определяет следующий метод, в котором происходит фильтрация.Объект ContainerRequest содержит информацию о текущем запросе.

public ContainerRequest filter(ContainerRequest req);

После этого включите следующий XML-файл в конфигурацию сервлета в web.xml

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
  <param-value>path.to.filtering.class</param-value>
</init-param>

Источники:

http://jersey.576304.n2.nabble.com/ContainerRequestFilter-and-Resources-td4419975.html http://markmail.org/message/p7yxygz4wpakqno5

9 голосов
/ 26 июля 2013

Этот поток немного староват, но у меня было время, перехватывавшее до и после запроса После долгих поисков в интернете я наконец понял это:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>blah.LoggingFilter</param-value>
</init-param>
<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>blah.LoggingFilter</param-value>
</init-param>

а затем этот класс:

public class LoggingFilter extends LoggingFilter implements ContainerRequestFilter {

    private static final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
    public static boolean verboseLogging = false;

    @Override
    public ContainerRequest filter(ContainerRequest arg0) {
        startTime.set(System.currentTimeMillis());
        return arg0;
    }

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
        System.out.println(System.currentTimeMillis() - startTime.get().longValue());
        StringBuilder sb = new StringBuilder();
        sb.append("User:").append((request.getUserPrincipal() == null ? "unknown" : request.getUserPrincipal().getName()));
        sb.append(" - Path:").append(request.getRequestUri().getPath());
        //...
    }

Перехватывает запрос в начале и в конце, чтобы вы могли включить таймер или что-то еще.

Это работает для Джерси 1.17. Не уверен насчет 2.x.

0 голосов
/ 06 декабря 2010

Для серверной части мы используем класс, специфичный для Джерси, чтобы сделать что-то вроде этого: ContainerResponseFilter

Подпись:

public ContainerResponse filter(ContainerRequest request, ContainerResponse response)

тогда вы можете делать звонки, как:

Object entity  = response.getEntity();
    ... your logic here ...
return response;

Может ли это помочь? ..

0 голосов
/ 05 декабря 2010

Вы смотрели на класс Jersey <a href="http://jersey.java.net/nonav/apidocs/1.4/jersey/com/sun/jersey/api/client/filter/ClientFilter.html" rel="nofollow">ClientFilter</a>?

В настоящее время мы используем его для перехвата и выполнения API-версий и т. Д. Есть встроенные фильтры журналов - так что вы можете посмотреть их кодчтобы понять, что писать.

Подпись:

public ClientResponse handle(final ClientRequest cr) throws ClientHandlerException...

Таким образом, вы можете начать делать такие вещи, как:

....
cr.getHeaders()
....
return getNext().handle(cr);
...