В контейнере сервлетов у вас есть сервлеты и фильтры сервлетов. Обычно сервлеты обрабатывают обработку запроса, а серверный фильтр обрабатывает предварительную обработку запроса. Таким образом, поток запросов выглядит как
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 в фильтр Джерси и получить от него атрибуты.
Это всего лишь пример. Есть так много вариантов использования. Вам просто нужно потратить время на то, чтобы решить, что будет лучшим для вашего приложения, и какой тип фильтра реализовать. Большую часть времени вы можете избежать использования фильтра Джерси, но иногда вам нужно фильтровать, чтобы он вызывался как можно раньше в запросе, и в этом случае вы можете использовать фильтр сервера. В других случаях вам необходим доступ к информации, которую можно получить только в приложении Джерси. Для этого вы должны использовать фильтр Джерси.