Java DropWizard中的名称绑定(Jersey)
我想通过JWT使用Jersey for Auth的NameBinding创建自定义注释,我在另一个普通java项目中使用了这项技术,一切都很完美,但它在DropWizard项目中不起作用。据我所知,DW也使用球衣休息。这是我的测试代码,但不起作用 界面:Java DropWizard中的名称绑定(Jersey),java,rest,jersey,dropwizard,Java,Rest,Jersey,Dropwizard,我想通过JWT使用Jersey for Auth的NameBinding创建自定义注释,我在另一个普通java项目中使用了这项技术,一切都很完美,但它在DropWizard项目中不起作用。据我所知,DW也使用球衣休息。这是我的测试代码,但不起作用 界面: @NameBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Auth {} @Auth @Provider public class AuthFilte
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Auth {}
@Auth
@Provider
public class AuthFilter implements ContainerRequestFilter {
private static final String SECRET = "SOME_SECRET_STRING";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
try {
String userToken = requestContext.getHeaderString("token");
Claims body = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(userToken).getBody();
if(body.getExpiration().before(new Date())) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Token is expired")
.build());
}
} catch (Exception e) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Error")
.build());
}
}
}
@GET
@Path("/test")
@Auth
public String test() {
return "Hello, " + userName;
}
实施:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Auth {}
@Auth
@Provider
public class AuthFilter implements ContainerRequestFilter {
private static final String SECRET = "SOME_SECRET_STRING";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
try {
String userToken = requestContext.getHeaderString("token");
Claims body = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(userToken).getBody();
if(body.getExpiration().before(new Date())) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Token is expired")
.build());
}
} catch (Exception e) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Error")
.build());
}
}
}
@GET
@Path("/test")
@Auth
public String test() {
return "Hello, " + userName;
}
休息:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Auth {}
@Auth
@Provider
public class AuthFilter implements ContainerRequestFilter {
private static final String SECRET = "SOME_SECRET_STRING";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
try {
String userToken = requestContext.getHeaderString("token");
Claims body = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(userToken).getBody();
if(body.getExpiration().before(new Date())) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Token is expired")
.build());
}
} catch (Exception e) {
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Error")
.build());
}
}
}
@GET
@Path("/test")
@Auth
public String test() {
return "Hello, " + userName;
}
有人能帮我解决这个问题吗?我找到了解决方案,并发布了答案,这将对某人有所帮助。我必须在run方法中注册AuthFilter类:
environment.jersey().register(new AuthFilter());