我试图拦截在Glassfish内运行的泽西岛的请求。
我创建了ContainerRequestFilter
package mycustom.api.rest.security;
@Provider
public class SecurityProvider implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
return request;
}
}
我的应用程序是使用PackagesResourceConfig
的子类开始的。
当Glassfish开始时,球衣找到我的提供者:
INFO: Provider classes found:
class mycustom.rest.security.SecurityProvider
但它永远不会遇到filter
方法。我错过了什么?
其他一切似乎都运转良好。我添加了几个ContextResolver
提供程序来执行JSON映射,它们工作正常。请求打我的资源很好,它从来没有经过过滤器。
答案 0 :(得分:3)
我不认为容器过滤器是作为提供者加载的。我认为你必须设置响应过滤器属性。奇怪的是PackagesResourceConfig没有setProperty()
,但您可以重载getProperty()
和getProperties()
:
public Object getProperty(String propertyName) {
if(propertyName.equals(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS)) {
return new String[] {"mycustom.rest.security.SecurityProvider"};
} else {
return super.getProperty(propertyName);
}
}
public Map<String,Object> getProperties() {
propName = ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS;
Map<String,Object> result = super.getProperties();
result.put(propName,getProperty(propName));
return result;
}
实际上,更仔细地阅读javadocs,似乎首选的方法是:
myConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
new String [] {"mycustom.rest.security.SecurityProvider"});