我正在使用Java EE,JAX-RS,Jersey编写API。在这样做的过程中,我实现了自己的安全上下文和安全过滤器。
看看像这样的问题(How to get MIME type of uploaded file in Jersey)我看过@Secure注释,但是它做了什么?我希望这是一个注释,它以与@RolesAllowed检查用户是否有权访问特定方法相同的方式查询安全上下文的isSecure方法。如果有这样的方式这样做的注释或我坚持使用@Context来获取安全上下文,只是从那。
答案 0 :(得分: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
。有两种方式:
通过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
)并确保此文件位于应用程序的类路径中。