java - 如何从常规 servlet 过滤器访问 JAX RS 方法?

标签 java jakarta-ee servlets jax-rs java-ee-6

我正在为我的 JAX-RS API 创建自定义身份验证模型。由于我使用的是 Java EE 6,它不支持拦截器,因此我必须使用常规过滤器来完成。

我想根据一组规则(如公共(public)和私有(private)方法)注释我的 JAX-RS 方法。为此,我需要通过过滤器访问我的资源方法(以便能够读取注释)。

我该怎么做? 是否有任何其他不涉及将我的环境更新到 JAX-RS 2.0 的好选择?

编辑 1:不幸的是,我正在寻找可移植性。

最佳答案

我们开始了关于 CDI 的对话,但评论中无法包含该信息...所以为了解决您的顾虑:

  1. CDI 拦截器是可移植的。
  2. 为了访问HttpServletRequest,您需要一个前端过滤器将其置于上下文中(例如ThreadLocal 或CDI 的@RequestScoped 以及一些生产者)。但是 DeltaSpike 为您介绍了 servlet模块。另请查看 security模块。
  3. HttpServletRequest 注入(inject)拦截器,无需对资源本身进行额外的参数。
  4. 要更改返回的响应,只需从 @AroundInvoke 拦截器方法返回一些内容。您可以使用 InvocationContext.proceed() 访问原始方法返回的对象。 .

总结一下(几乎是伪代码):

@MySecurityInterceptorBinding
public class MySecurityInterceptor {
    @Inject HttpServletRequest request;

    @AroundInvoke
    public Object secure(InvocationContext ctx) {
        // check security
        if( request.isUserInRole("foo") ) {
            Object value = ctx.proceed();
            // modify the returned value
            ((MyCustomResponseBase) value).setSecurityPassedFlag(true);
            return value;
            // or change it altogether (I'm not sure if this is entirely possible, try and see :)
            MyResponseValueWrapper w = new MyResponseValueWrapper(value);
            w.setXxxx("yyyy");
            return w;
        }
        else {
            // handle it...
        }
    }

关于java - 如何从常规 servlet 过滤器访问 JAX RS 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301896/

相关文章:

java - 从 Web 应用程序中发送/接收电子邮件?

java - 编写一个简单的servlet。通过servlet获取和发送数据

css - 调用转发到 JSP 的 Servlet 时,浏览器无法访问/查找相关资源,如 CSS、图像和链接

java - HTTP 状态 : 404 - Java Servlet

java - 对 List 对象内的 List 进行排序

java - 在 JSP 中,是否可以打印名称在另一个变量中的变量的值?

java - 在java中运行系统命令

eclipse - tomcat-maven-插件 : Server returned HTTP response code: 403

java - 以编程方式更改 ImageResource(可绘制)

java - 使用非对称加密(公共(public)私钥 Enc)时出现 IllegalBlockSize 异常