【发布时间】:2017-05-02 16:53:36
【问题描述】:
我使用 undertow 作为我的 HTTP 库,并希望验证每个请求的 JWT 令牌和 HTTP 方法。我不想在每个HttpHandler 中实现验证。这是正确的做法吗?
Handler.java
public abstract class Handler implements HttpHandler {
private HttpString[] methods;
Handler(HttpString... methods) {
this.methods = methods;
}
@Override
public void handleRequest(HttpServerExchange httpServerExchange) throws Exception {
// verifying HTTP method
boolean verified = false;
for (HttpString method : methods) {
if (httpServerExchange.getRequestMethod().equals(method)) {
verified = true;
break;
}
}
if (!verified) {
// return http 405, cause: invalid HTTP method
httpServerExchange.setStatusCode(StatusCodes.METHOD_NOT_ALLOWED);
httpServerExchange.getResponseSender().send(Variables.Response.EMPTY);
}
// verifying JWT token
String jwt = httpServerExchange.getRequestHeaders().get("jwt", 0);
JWT.verifyToken(jwt)
.addListener(token -> {
if (token != null) {
handleVerifiedRequest(httpServerExchange, token);
} else {
// return http 400, cause: JWT invalid
httpServerExchange.setStatusCode(StatusCodes.UNAUTHORIZED);
httpServerExchange.getResponseSender().send(Variables.Errors.INVALID_JWT);
}
});
}
public abstract void handleVerifiedRequest(HttpServerExchange httpServerExchange, String Token);
}
HelloHandler.java
public class HelloHandler extends Handler {
public HelloHandler(HttpString... methods) {
super(methods);
}
@Override
public void handleVerifiedRequest(HttpServerExchange httpServerExchange, String Token) {
// .. do something
}
}
【问题讨论】:
-
看起来您的解决方案没有任何问题。
-
@aiguy 酷,谢谢!这是第一次实现一个抽象类.. :D
-
使用这种方法会阻止你链接其他处理程序。我建议您坚持使用 Undertow API(HttpHandler 和交换附件。)如果您有兴趣,我可以详细说明实际答案。
-
@aramaki 我很感兴趣,我将不胜感激。