Есть ли на Джерси перехватчик, похожий на тот, что был в Spring's HandlerInterceptor
Мне нужен I, nterceptor в Jersey 2.x, который дает ссылки на запрос, ответ и метод, который соответствует пути к веб-службе.
Что-то похожееHandlerInterceptor весны.
Требования:
Нужны аннотации, используемые на уроке - Выполните следующие проверки, только если соответствующий метод, который должен быть вызван джерси, НЕ аннотируется пользовательской аннотацией.Запрос - Получить / установить атрибуты и получить объект сеанса для проверки пользователя.отклик - Для перенаправления вызова в случае, если любая проверка не пройдена даже до вызова соответствующего Methos.Spring эквивалентный код:
public class WebServiceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
SkipWebServiceIntercept skipWebService = handler.getClass().getAnnotation(SkipWebServiceIntercept.class);
if (skipWebService != null) {
return Boolean.TRUE;
}
...
if(securityFails)
{
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
String json;
...
out.println(json);
return Boolean.FALSE;
}
else {
response.sendRedirect(redirectUrl);
}
}
else
{
return Boolean.TRUE;
}
}catch (Exception e) {
log.error("Exception in preHandle, redirecting to Login page", e);
return LoginUtil.redirectToLogin(request, response);
}
}
}
Я нашел ссылки на
ReaderInterceptor - Это обеспечивает только аннотации класса. Нет доступа к запросу / ответу.ContainerRequestFilter - Предоставляет объект запроса, но не аннотации / ответ.ContainerResponseFilter - Дает запрос и ответ. Но после того, как веб-сервис / метод вызывается.Есть ли другой способ, которым это может быть достигнуто без использования фильтров. потому что мне нужно, чтобы эта обработка происходила ТОЛЬКО при наличии соответствующего веб-сервиса. С другой стороны, фильтры с / * всегда будут выполнять эти проверки, даже если ресурс не найден.
Редактировать: Благодаря @peeskilletответ Вот как я это реализовал.
@Provider
public class ResourceInterceptor implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
System.out.println("Resource Interceptor called");
if (resourceInfo.getResourceClass() != null
&& resourceInfo.getResourceClass().getAnnotation(SkipWebServiceIntercept.class) != null)
return;
context.register(LoginFilter.class);
}
}
@Slf4j
public class LoginFilter implements ContainerRequestFilter {
@Context
private HttpServletRequest request;
@Context
private ServletContext servletContext;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
try {
WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
CookieAuthenticator cookieAuthenticator = springContext.getBean(CookieAuthenticator.class);
HttpSession session = request.getSession(true);
...
// Отправка JSON / Object обратно в ответ
...
String json = gson.toJson(resposeJson);
Response response = new ResponseBuilderImpl().encoding(StandardCharsets.UTF_8.name())
.type(MediaType.APPLICATION_JSON).entity(json).build();
requestContext.abortWith(response);
...
// или возвращаем URL
...
URI uri = new URI(baseUrl + redirectUrl + "?refback=" + url);
requestContext.abortWith(Response.temporaryRedirect(uri).build());
...
Оба подхода работают отлично, аналогично HandlerInterceptor из Spring.