且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在 Jersey 1.18.1 请求过滤器中获取资源注释

更新时间:2023-12-03 13:02:46

您可以实现一个 ResourceFilterFactory 来获取 AbstractMethod.

You can implement a ResourceFilterFactory to get the AbstractMethod.

public class AuthorizationFilterFactory implements ResourceFilterFactory {

    @Override
    public List<ResourceFilter> create(AbstractMethod abstractMethod) {
        return Arrays.asList(this.createAuthorizationFilter(abstractMethod));
    }

    private ResourceFilter createAuthorizationFilter(final AbstractMethod abstractMethod) {
        return new ResourceFilter() {
            @Override
            public ContainerRequestFilter getRequestFilter() {
                return new AuthorizationFilter(abstractMethod);
            }

            @Override
            public ContainerResponseFilter getResponseFilter() {
                return null;
            }
        };
    }
}

因此,您的 AuthorizationFilter 将如下所示:

So, your AuthorizationFilter will look like:

@Provider
public class AuthorizationFilter implements ContainerRequestFilter {

    private final AbstractMethod method;

    public AuthorizationFilter(AbstractMethod method) {
        this.method = method;
    }

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        Realm realm = null;
        User user = Context.get(Session.class).getUser();
        for (Annotation annotation : method.getAnnotations()) {
            if (AuthorizedFor.class == annotation.annotationType()) {
                realm = ((AuthorizedFor) annotation).value();
            }
        }
        if (realm != null) {
            for (Realm userRealm : user.getRole().getAllowedRealms()) {
                if (userRealm.equals(realm)) {
                    return request;
                }
            }
        }
        throw new ApiException(ResponseCode.UNAUTHORIZED);
    }
}

要注册您的工厂:

environment.jersey().getResourceConfig().getResourceFilterFactories().add(new AuthorizationFilterFactory());