2015-12-14 3 views
0

Я пытаюсь использовать 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) + "\"}"; 
    } 
} 

Клиент должен называть аутентификацию затем получить маркер будет используется со следующими вызовами.

Мои вопросы

  1. Мне нужно проанализировать токен, чтобы получить вошедшего в систему пользователя, а затем передать его в HttpRequest так что ресурсы могут легко получить доступ к нему. Iam делает это с помощью этого кода

    exchange.getAttachment (ServletRequestContext.ATTACHMENT_KEY) .getServletRequest() .setAttribute («ПОЛЬЗОВАТЕЛЬ», пользователь);

Но это метание NPE, так как exchange.getAttachement() возвращает null.

  1. Я заметил, что MyHandler вызывается дважды (до и после подачи запроса). Мне нужно сделать свою логику (анализируя токен) только один раз. Я устанавливаю флаг в параметрах запроса для этого, но я не уверен, что это правильный путь.

ответ

0

Ну, это обходной путь,

public class MyTSA implements ThreadSetupAction { 

private static final Logger logger = LoggerFactory.getLogger(MyTSA.class); 

@Override 
public Handle setup(HttpServerExchange exchange) { 
if (exchange == null) 
    return null; 
    String token = exchange.getRequestHeaders().getFirst(TOKEN_HEADER_PARAM); 
    if (!AppUtil.isNullOrEmpty(token)) { 
    try { 
     User user = ServiceLocator.SECRUTIY_SERVICE.validateToken(token); 
     exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY).getServletRequest() 
      .setAttribute("USER", user); 

    } catch (Exception e) { 
     logger.warn("setup(HttpServerExchange) - exception ignored", e); 
    } 
} 
return null; 
}} 

До этого, при создании информации развертывания, передать новый экземпляр этой темы Настройка действий для развертывания информации.

DeploymentInfo di = .... 

di.addThreadSetupAction(new MyTSA()); 
Смежные вопросы