RESTEasy与Undertow,访问HttpServlet请求



我正在尝试使用带有underflow的RESTEasy。首先,我厌倦了UndertowJaxrsServer源代码,但发现它直接使用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) + ""}";
    }
}

客户端应该调用authenticate,然后获取要用于下一次调用的令牌。

我的问题是

  1. 我需要分析令牌以获得登录用户,然后将其传递到HttpRequest中,以便资源可以轻松访问它

    exchange.getAttachment(Servlet请求上下文.ATTACHMENT_KEY).getServlet请求().setAttribute("USER",用户);

但是它抛出了NPE,因为exchange.getAttachment()返回null。

  1. 我注意到MyHandler被调用了两次(在提供请求之前和之后),我只需要做一次逻辑(分析令牌)。我在请求参数中设置了一个标志,但我不确定这是正确的方式

好吧,这是一个变通方法,

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());

相关内容

  • 没有找到相关文章

最新更新