java - 什么是 Resteasy 3.X PreProcessInterceptor 的正确替代品?

标签 java rest jax-rs resteasy

我正在使用本教程中描述的身份验证/授权机制构建休息服务:http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/

基本上它使用 PreProcessInterceptor接口(interface)扫描目标方法的注释(来自 javax.annotation.security 包),这些注释描述了访问该方法所需的角色。由于这里的authenticator是一个拦截器,它可以取消目标方法的调用,如果需要返回一个401(未授权)。

这里的问题是接口(interface) org.jboss.resteasy.spi.interception.PreProcessInterceptor 在当前的 RestEasy 版本(3.0.1)中已被弃用,我在尝试使用标准 JAX 实现相同的行为时遇到问题-RS 接口(interface)。

我正在使用 javax.ws.rs.ext.ReaderInterceptor 接口(interface)来拦截调用。但不知何故,服务器从不调用它:拦截器只是被忽略了。

我注册拦截器/资源的方式与之前的 PreProcessInterceptor 相同,并使用相同的 @Provider 和 @ServerInterceptor 注释:

服务器应用程序:

public class ServerApplication extends javax.ws.rs.core.Application {

     private final HashSet<Object> singletons = new LinkedHashSet<Object>();

     public ServerApplication() {
         singletons.add(new SecurityInterceptor());
         singletons.add( ... ); //add each of my rest resources
     }

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>();
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

安全拦截器:

@Provider
@ServerInterceptor
public class SecurityInterceptor implements javax.ws.rs.ext.ReaderInterceptor {
     @Override
     public Object aroundReadFrom(ReaderInterceptorContext context){
            //code that is never called... so lonely here...
     }
}

关于如何解决这个问题的任何见解?

谢谢。

最佳答案

RESTEasy 3.x.x 符合 JAX-RS 2.0 规范。

您正在尝试做的事情可以通过以下方式完成(也许更好):

@Provider
public class SecurityInterceptor 
      implements javax.ws.rs.container.ContainerRequestFilter {
     @Override
     public void filter(ContainerRequestContext requestContext){
       if (not_authenticated){ requestContext.abortWith(response)};
     }
}

因为 ReaderInterceptor 仅在底层 MessageBodyReader.readFrom 由标准 JAX-RS 管道而不是从应用程序代码调用时才被调用。

但是,您的拦截器未被调用的原因可能是 @ServerInterceptor 注释,它是一个 RESTEasy 扩展。

规范在 §6.5.2 中声明拦截器是全局注册的,除非 @Provider 使用 @NameBinding 注释进行注释,但我不知道如果 RESTEasy 可以处理 @ServerInterceptor 如果它没有显式注册,如 RestEASY Interceptor Not Being Called 所示

关于java - 什么是 Resteasy 3.X PreProcessInterceptor 的正确替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17594910/

相关文章:

java - 如何将父比较器与子比较器结合起来

java - 处理 Mule 流中的特定异常

android - 如何使用 JSON 创建 WEB 服务器

java - 客户端处理与服务器处理

java - ANDROID sendBroadcast 到 UNITY BroadcastReceiver 不工作

java - 在区域设置中设置语言

java - 从我的异步线程调用 Activity 类中的方法

android - 如何在家庭服务器(可能是 Android 手机)上托管 Django REST API?

Racket 中的剩余参数,零或一个参数程序

java - 使用 Java 在 REST Web 服务中启用恢复中断下载