【发布时间】:2016-03-19 12:52:43
【问题描述】:
我正在尝试将 RESTEasy 与 undertow 一起使用。首先我厌倦了UndertowJaxrsServersource,但发现它是直接使用PathHandler。所以我驱动了另一个继承自 PathHandler 的类,并更改了 UndertowJaxrsServer 以使用该类。
这是我从 PathHandler 驱动的新 Handler 中的 handleRequest 方法
@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("/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) + "\"}";
}
}
客户端应调用身份验证,然后获取用于下一次调用的令牌。
我的问题是
-
我需要分析 Token 以获取登录用户,然后将其传递到 HttpRequest 中,以便资源可以轻松访问它。我正在通过此代码执行此操作
exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY).getServletRequest() .setAttribute("USER", user);
但它会抛出 NPE,因为 exchange.getAttachement() 返回 null。
- 我注意到 MyHandler 被调用了两次(在服务请求之前和之后)我只需要执行一次我的逻辑(分析令牌)。我在请求参数中设置了一个标志来这样做,但我不确定这是正确的方法。
【问题讨论】:
标签: java jax-rs resteasy undertow