@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
)并确保该文件位于应用程序的类路径中。