2

我正在使用 Java EE、JAX-RS、Jersey 编写 API。为此,我实现了自己的安全上下文和安全过滤器。

看着像这样的问题(如何在 Jersey 中获取 MIME 类型的上传文件)我已经看到了 @Secure 注释,但它有什么作用?我希望这是一个注释,它以与 @RolesAllowed 检查用户是否有权访问特定方法的方式相同的方式查询安全上下文的 isSecure 方法。如果是这样,是否有这样一种方法可以使用注释来做到这一点,或者我是否坚持使用@Context 来获取安全上下文并从中获取。

4

1 回答 1

1

@Secure注释似乎是自定义注释。JAX-RS/Jersey 不支持这种开箱即用的功能,但实现起来并不难。假设您有自己的@Secure注释,并且您想要检查使用此注释注释的方法的通信通道是否安全。您需要创建一个自定义ResourceFilterFactory,您将在其中为此类方法分配一个特殊的过滤器:

public class IsSecureResourceFilterFactory implements ResourceFilterFactory {

    private class IsSecureFilter implements ResourceFilter, ContainerRequestFilter {

        // ResourceFilter

        @Override
        public ContainerRequestFilter getRequestFilter() {
            return this;
        }

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

        // ContainerRequestFilter

        @Override
        public ContainerRequest filter(final ContainerRequest request) {
            // Check whether the channel is secure.
            if (request.isSecure()) {
                return request;
            }

            // Throw an exception if it's not.
            throw new WebApplicationException(Response.Status.FORBIDDEN);
        }
    }

    @Override
    public List<ResourceFilter> create(final AbstractMethod abstractMethod) {
        // Add IsSecureFilter for resource methods annotated with @Secure annotation (ignore other resource methods).
        return abstractMethod.isAnnotationPresent(Secure.class)
                ? Collections.<ResourceFilter>singletonList(new IsSecureFilter()): null;
    }
}

现在你需要告诉泽西这件事ResourceFilterFactory。有2种方式:

  • 通过web.xml

    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>my.package.IsSecureResourceFilterFactory</param-value>
    </init-param>
    
  • 或通过META-INF/services机制 - 您需要创建一个名为的文件,该文件META-INF/services/com.sun.jersey.spi.container.ResourceFilterFactory将包含您的工厂的完全限定名称(在本例中my.package.IsSecureResourceFilterFactory)并确保该文件位于应用程序的类路径中。

于 2013-08-21T08:11:28.600 回答