@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
)を含むというファイルを作成し、このファイルがアプリケーションのクラスパスにあることを確認する必要があります。