我正在尝试设置请求过滤器,因为我想在调用逻辑之前检查一些http标头信息。不幸的是,我的过滤器永远不会在JBoss AS7.1.1中被调用。我已经尝试将RestEasy实现(模块)更新到3.0.6,如RestEasy文档中所述。它说你只需要替换新实现zip文件提供的目录,我这样做了。 AS开始没有任何错误,但行为不会以任何方式改变。每个请求都不会被截获。我从一个更复杂的例子中提取了这个代码,但即使这个简单的事情也行不通:
Filter.java
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
@Provider
@Secured
public class SecurityFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext crc) throws IOException {
throw new IllegalStateException("Not in my house");
}
}
ItemsResource.java
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
@Path("/Items")
public class ItemsResource {
@GET
@Produces("application/json")
@Secured
public String getJson() {
return "{\"id:\" \"1\"}";
}
}
ApplicationConfig.java
@javax.ws.rs.ApplicationPath("rest")
public class ApplicationConfig extends Application {
}
Secured.java
import javax.ws.rs.NameBinding;
@NameBinding
public @interface Secured {}
如果我尝试使用拦截器和没有注释的资源,我不会改变任何东西。我希望所有的请求都必须被截获,但不会被截获。我没有任何胶水做什么。有人可以帮我们一些建议吗?让我们添加一些额外的东西。我和Wildfly(JBoss 8.0.0 Final)尝试过同样的事情。使用@NameBinding并应用自定义注释进行拦截也不起作用,但如果我不使用注释,只需使用@Provider注释拦截器,我的所有请求都会被拦截。我是否必须迁移到Wildfly或者什么?
答案 0 :(得分:4)
我们遇到了同样的问题。
我们使用了 3.0.8.Final 版本的RESTeasy与POM依赖关系。
还使用zip文件 resteasy-jaxrs-3.0.7.Final 的内容更新 JBOSS (EAp 6.1)的模块。
唯一不同的是我们使用的过滤器:
@Provider @PreMatching
@Precedence("SECURITY")
public class SecurityInterceptor implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext arg0) throws IOException {
...
}
}
此外,我们还需要手动注册 web.xml 中的提供商:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.neology.rest.SecurityInterceptor</param-value>
</context-param>
我们遇到的其他问题是 Spring 集成。
首先要验证 *听众的顺序
<!-- RESTeasy Listener 1st -->
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<!-- Spring Listener 2nd -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
另请检查安全过滤器链。如果您已将其余servlet映射配置为/rest/*
,则需要使Spring 不过滤 REST服务。我们在Spring xml配置中使用它:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<mvc:resources mapping="/rest/**" location="/rest/" />
希望这有帮助!
答案 1 :(得分:1)
您可以使用Resteasy PreProcessInterceptor
:
import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import javax.ws.rs.ext.Provider;
@Provider
@ServerInterceptor
public class SecurityInterceptor implements PreProcessInterceptor {
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException {
if (/* Check if a user is currently authenticated */) {
// no current authenticated user: throw exception
throw new NotAuthenticatedException();
}
return null; // = continue without interrupting
}
}
答案 2 :(得分:0)
您的问题已经提到: Match Filter with specific Method through NameBinding on RESTeasy
您需要删除@PreMatching并确保在运行时保留您的安全注释(Retention = RUNTIME)。
答案 3 :(得分:0)
在META-INF / services下添加一个Provider文件,如:/META-INF/services/javax.ws.rs.ext.Providers,javax.ws.rs.ext.Providers是一个文件,内容是您的过滤路径如:com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter