Я пытаюсь использовать RESTEasy с подносом. Сначала я устал UndertowJaxrsServersource, но выяснил, что он напрямую использует PathHandler. Поэтому я поместил другой класс, наследующий от PathHandler, и изменил UndertowJaxrsServer для использования этого класса.RESTEasy с Undertow, доступ к HttpServletRequest
Вот handleRequest метод в новом обработчике я изгнан из PathHandler
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
if (exchange.isInIoThread()) {
exchange.dispatch(this);
return;
}
boolean processed = exchange.getQueryParameters().get("INSPECTED") != null;
if (!processed) {
exchange.addQueryParam(REQUEST_INSPECTED_PARAM, "T");
String path = exchange.getRequestPath();
if (!path.endsWith("https://stackoverflow.com/users/authenticate")) {
String token = exchange.getRequestHeaders().getFirst("TOKEN");
if (!AppUtil.isNullOrEmpty(token)) {
try {
User user = ServiceLocator.SECRUTIY_SERVICE.validateToken(token);
exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY).getServletRequest()
.setAttribute("USER", user);
super.handleRequest(exchange);
return;
} catch (Exception e) {
logger.warn("handleRequest(HttpServerExchange) - exception ignored", e);
}
}
exchange.setResponseCode(HttpResponseCodes.SC_FORBIDDEN);
exchange.endExchange();
return;
}
}
super.handleRequest(exchange);
} }
Это ресурс делает аутентификацию
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Formatted
public class Users {
@Context
HttpServletRequest request;
@Context
HttpServletResponse response;
@POST
@Path("/authenticate")
public String authenticate(@FormParam("username") String username, @FormParam("password") String password) {
return "{\"token\":\"" + ServiceLocator.SECRUTIY_SERVICE.authenticate(username, password) + "\"}";
}
}
Клиент должен называть аутентификацию затем получить маркер будет используется со следующими вызовами.
Мои вопросы
Мне нужно проанализировать токен, чтобы получить вошедшего в систему пользователя, а затем передать его в HttpRequest так что ресурсы могут легко получить доступ к нему. Iam делает это с помощью этого кода
exchange.getAttachment (ServletRequestContext.ATTACHMENT_KEY) .getServletRequest() .setAttribute («ПОЛЬЗОВАТЕЛЬ», пользователь);
Но это метание NPE, так как exchange.getAttachement() возвращает null.
- Я заметил, что MyHandler вызывается дважды (до и после подачи запроса). Мне нужно сделать свою логику (анализируя токен) только один раз. Я устанавливаю флаг в параметрах запроса для этого, но я не уверен, что это правильный путь.