Java 如何在一个应用程序中部署多个ResteasyInterceptor?
我正在JBoss7.1.1上使用RestEasy部署一些web服务。我有两个类,它们沿着同一条路径处理不同的资源请求。UserAPI.java句柄Java 如何在一个应用程序中部署多个ResteasyInterceptor?,java,jboss,web.xml,resteasy,interceptor,Java,Jboss,Web.xml,Resteasy,Interceptor,我正在JBoss7.1.1上使用RestEasy部署一些web服务。我有两个类,它们沿着同一条路径处理不同的资源请求。UserAPI.java句柄/books和/books/{id}等。MaintenanceAPI.java句柄/books/checkedout UserAPI需要以前的登录,该登录由名为AuthInterceptor的RestEasyInterceptor验证。维护API不需要登录,但只能通过本地主机作为GET访问;它由LocalInterceptor处理 为了将它们分开,Au
/books
和/books/{id}
等。MaintenanceAPI.java句柄/books/checkedout
UserAPI需要以前的登录,该登录由名为AuthInterceptor
的RestEasyInterceptor验证。维护API不需要登录,但只能通过本地主机作为GET访问;它由LocalInterceptor
处理
为了将它们分开,AuthInterceptor的accept()方法在声明.getName()包含(“维护”)时返回false,因此它根本不应该处理/books/checkedout
。如果声明.equals(MaintenanceAPI.class)
,LocalInterceptor的accept()方法将返回true
AuthInterceptor在web.xml中的“resteasy.providers”下声明。但是Eclipse认为XML元素中只能有一个参数,所以LocalInterceptor有注释@Provider
,希望它能神奇地工作
拒绝XML配置
这失败了:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.foo.AuthInterceptor</param-value>
<param-value>com.foo.LocalInterceptor</param-value>
</context-param>
resteasy.providers
com.foo.AuthInterceptor
com.foo.LocalInterceptor
我不确定正确的语法是什么,RestEasy文档中没有帮助。这也失败了:
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.foo.AuthInterceptor</param-value>
</context-param>
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.foo.LocalInterceptor</param-value>
</context-param>
resteasy.providers
com.foo.AuthInterceptor
resteasy.providers
com.foo.LocalInterceptor
然而,发生的事情是,从远程机器到/books/checkedout
(未经授权应失败)的URL请求被路由到UserAPI的/books/{id}/
处理程序,该处理程序继续尝试处理该请求并返回一个非常大的异常!!这是错误的,有几个原因:它不是正确的路径,不是正确的处理程序,不是正确的参数类型,并且它应该需要一个auth令牌!显然,LocalInterceptor不是通过注释神奇地添加的,因此它没有机会接受请求。AuthInterceptor必须正确地拒绝它,但是为什么会要求UserAPI处理它,而且为什么会为int{id}
分配字符串“checkedout”
我没有发布代码,因为我在问我是否可以做我正在尝试的事情(比如“为什么我不能将字符串子类化”-如果你理解这个问题,就不需要代码)以及为什么映射试图做错误的事情而不是失败
也许只需正确获取web.xml就可以了?对于您的xml配置(通常是web.xml),下面是您要查找的内容
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.foo.AuthInterceptor, com.foo.LocalInterceptor</param-value>
</context-param>
或如果我决定保留两个接口,我将使入口路径不同。基本上是这样的
@Path("/maintenance")
@Produces(MediaType.APPLICATION_JSON)
public interface MaintenanceAPI{
@GET
@Path("/books/checkedout")
public Response getCheckedOut();
}
// so the url here looks like --> /maintenance/books/checkedout
其他建议-过滤来自
本地主机
或远程
的请求,我以前使用过的一种非常强大的技术是访问/角色管理,类似于此
创建一个注释界面,如
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
然后,拦截器的accept()方法可以如下所示:
LocalInterceptor.java
@Override
public boolean accept(Class declaring, Method method) {
if(method.isAnnotationPresent(RolesAllowed.class)){
RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
return rolesSet.contains("local");
}
return false;
}
@Override
public boolean accept(Class declaring, Method method) {
if(method.isAnnotationPresent(RolesAllowed.class)){
RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
return rolesSet.contains("remote");
}
return false;
}
对于您的XML配置(通常是web.XML),下面是您要查找的内容
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.foo.AuthInterceptor, com.foo.LocalInterceptor</param-value>
</context-param>
或如果我决定保留两个接口,我将使入口路径不同。基本上是这样的
@Path("/maintenance")
@Produces(MediaType.APPLICATION_JSON)
public interface MaintenanceAPI{
@GET
@Path("/books/checkedout")
public Response getCheckedOut();
}
// so the url here looks like --> /maintenance/books/checkedout
其他建议-过滤来自
本地主机
或远程
的请求,我以前使用过的一种非常强大的技术是访问/角色管理,类似于此
创建一个注释界面,如
@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
String[] value();
}
然后,拦截器的accept()方法可以如下所示:
LocalInterceptor.java
@Override
public boolean accept(Class declaring, Method method) {
if(method.isAnnotationPresent(RolesAllowed.class)){
RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
return rolesSet.contains("local");
}
return false;
}
@Override
public boolean accept(Class declaring, Method method) {
if(method.isAnnotationPresent(RolesAllowed.class)){
RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
return rolesSet.contains("remote");
}
return false;
}