В чем разница между фильтром сервлетов и фильтром Джерси? - PullRequest
0 голосов
/ 06 сентября 2018

Я прочитал много уроков, но не понимаю, в чем различия между фильтрами сервлетов и фильтрами Джерси. Кто-нибудь может объяснить меня?

1 Ответ

0 голосов
/ 06 сентября 2018

В контейнере сервлетов у вас есть сервлеты и фильтры сервлетов. Обычно сервлеты обрабатывают обработку запроса, а серверный фильтр обрабатывает предварительную обработку запроса. Таким образом, поток запросов выглядит как

Request --> Filter --> Servlet --> Filter --> Response

Приложение Джерси, оно реализовано в виде сервлета. Так что в приведенном выше потоке, просто замените «Сервлет» на Джерси.

Request --> Filter --> Jersey-Servlet --> Filter --> Response

Джерси также имеет свои собственные фильтры, а именно ContainerRequestFilter и ContainerResponseFilter. Они служат той же цели, что и фильтр сервлетов, только в контексте приложения на Джерси; они предназначены для предварительной обработки и последующей обработки.

Request --> ContainerRequestFilter --> Resource --> ContainerResponseFilter -> Response

Таким образом, эти фильтры служат для одной и той же цели, до и после обработки запроса. Основным отличием является уровень, на котором они связаны. Фильтры сервлетов связаны на уровне сервлетов, а фильтры Джерси связаны на уровне Джерси.

Так какой из них вы должны использовать?

Ну, это зависит от того, когда вы хотите позвонить и к какой информации вам нужен доступ. Взять, к примеру, безопасность. Размышляя о защите своего приложения, вы, возможно, захотите, чтобы ворота безопасности были как можно дальше от данных. Таким образом, вы можете реализовать свою безопасность, используя фильтры сервлетов. Но вам нужна информация, которую можно получить только из приложения Джерси, тогда вам нужно будет использовать фильтры Джерси. Например, вам нужно знать, какой метод ресурса вызывается. Вы можете получить эту информацию только из ResourceInfo внутри фильтра Джерси

class MyResource {
    @RolesAllowed("ADMIN")
    public Response get() {}
}

class AuthorizationFilter implements ContainerRequestFilter {
    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext request) {
        Method method = resourceInfo.getResourceMethod();
        RolesAllowed rolesAllowed = method.getAnnotation(RolesAllowed.class);
    }
}

Вы не можете сделать это в фильтре сервлетов. Эта информация доступна только из контекста заявки на Джерси. Возможно, вы захотите обработать аутентификацию в фильтре сервлетов и после аутентификации сохранить результаты в атрибутах HttpServletRequest. Затем в авторизации вы можете позаботиться об этом на уровне Джерси, как показано выше. Вы можете вставить HttpServletRequest в фильтр Джерси и получить от него атрибуты.

Это всего лишь пример. Есть так много вариантов использования. Вам просто нужно потратить время на то, чтобы решить, что будет лучшим для вашего приложения, и какой тип фильтра реализовать. Большую часть времени вы можете избежать использования фильтра Джерси, но иногда вам нужно фильтровать, чтобы он вызывался как можно раньше в запросе, и в этом случае вы можете использовать фильтр сервера. В других случаях вам необходим доступ к информации, которую можно получить только в приложении Джерси. Для этого вы должны использовать фильтр Джерси.

...