当注释有参数时,CDI 拦截器不起作用

2023-11-21

我正在尝试实现一个@Restricted注释,以用户只有在登录并具有特定角色时才能访问它们的方式保护控制器方法。我在 Tomcat 7 上使用 JSF 和 CDI,所以没有 EJB。只要注释接口不指定任何参数,拦截器就会被调用。一旦我添加一个@Nonbinding Role value() default Role.ADMIN;参数,拦截器和控制器方法都不执行。也没有错误或异常。这是我的代码,我真的不知道它有什么问题:

注解:

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Restricted {
    @Nonbinding Role value() default Role.ADMIN; // ###
}

拦截器:

@Interceptor
@Restricted
public class RoleBasedRestrictingInterceptor implements Serializable {
    @Inject
    ISecurityManager security;

    @AroundInvoke
    public Object intercept(final InvocationContext ctx) throws Exception {
        final Restricted annotation = ctx.getClass().getAnnotation(Restricted.class);
        log.info("Intercepted, required role is: {}", annotation.value()); // ###
        log.info("User is logged in: {}", security.isLoggedIn());
        return ctx.proceed();
    }
}

控制器:

@Named("manageUsers")
@SessionScoped
public class ManageUsersBacking extends implements Serializable {   
    @Restricted(Role.ADMIN) // ###
    public void testRestricted() {
        log.info("testRestricted()");
    }
}

The ###事件标记了必须更改或删除的内容才能使其再次工作。拦截器正确定义在WEB-INF/beans.xml,因为它在我的注释中没有角色参数的情况下工作。

16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.s.RoleBasedRestrictingInterceptor - User is logged in: true
16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.c.admin.ManageUsersBacking - testRestricted()

今天我重新审视了这个特定问题,发现它与 CDI 无关:

ctx.getClass().getAnnotation(Restricted.class)

显然,我的示例中没有类级别注释。所以 getAnnotation() 返回null。相反,我应该使用以下内容:

ctx.getMethod().getAnnotation(Restricted.class)

虽然我不知道为什么没有任何例外。也许发生了其他一些事情,我无法再重现,因为我将应用程序迁移到 TomEE。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当注释有参数时,CDI 拦截器不起作用 的相关文章

随机推荐

  • Rails 3:如何通过javascript触发表单提交?

    我有一个表单 大部分只是作为普通表单提交 所以我不想在 form tag 中设置 remote gt true 选项 然而 在某些情况下 我希望能够有一个 javascript 函数发布表单 就像它是通过 remote gt true 发布
  • ASP.NET Identity - 使用安全标记强制重新登录

    So from ASP NET Identity 的 IUserSecurityStampStore 接口是什么 我们了解到 ASP NET Identity 具有安全标记功能 用于使用户登录 cookie 无效 并强制他们重新登录 在我的
  • 如何将dispatch_data_t转换为NSData?

    这是正确的方法吗 convert const void buffer NULL size t size 0 dispatch data t new data file dispatch data create map data buffer
  • 如何在闪亮页面而不是弹出窗口中渲染 scatter3d

    我正在考虑在我闪亮的应用程序中实现 3D 交互式绘图 到目前为止我一直在使用plotly 然而 plotly 有一个主要缺点 渲染时速度非常慢 我已经完成了检查 尽管涉及大量数据集 但更新的 outplot plot 因此 我希望使用一个名
  • 同时运行延迟作业和 Sidekiq

    我目前使用延迟作业来异步处理作业 我没有创建工人 而是使用 delay方法很多 我想转到 Sidekiq 但我的工作类型太多 无法确保所有工作都是线程安全的 所以我想并行运行 Delayed Job 和 Sidekiq 并一次迁移一种类型的
  • 如何捕获 pg_connect() 函数错误?

    pg connect 以表格式显示错误 而不是以表格式显示错误消息 需要错误消息警报 错误信息警告 pg connect function pg connect 无法连接到 PostgreSQL 服务器 致命 第 41 行 home tes
  • 使用 log4j2 进行公共日志记录

    我正在使用 log4j 1 2 和 commons logging 现在我正在尝试将其升级到log4j2 但是如何使用 log4j2 和 commons logging 来初始化 log4j2 我尝试通过以下方式初始化公共日志记录 它工作正
  • 从 JSON 检索项目时出现“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”

    当有以下代码时 var TermSource token Value
  • 代表们快了?

    如何任命一名代表 即NSUserNotificationCenterDelegate快点 以下是关于两个视图控制器之间的委托的一些帮助 Step 1 在您将要删除 将发送数据的 UIViewController 中制定一个协议 protoc
  • 在没有故事板的情况下启动ios项目

    我在使用 xibs 而不是故事板启动 iOS 应用程序时遇到了一些麻烦 问题是我遇到黑屏并且第一个视图控制器没有被调用 添加断点viewDidLoad方法 在应用程序委托标头中 我声明了这一点 property strong nonatom
  • linq 异常:只能从 LINQ to Entities 调用此函数

    我正在尝试获取保存在缓存中的数据 但它在 select new FilterSsrsLog 行上引发异常 例外 此函数只能从 LINQ to Entities 调用 List
  • 自动导入包的顺序和歧义

    JLS 第 7 章 软件包 一个包由许多编译单元组成 第 7 3 节 一个编译单元自动有权访问其包中声明的所有类型并且自动导入预定义包 java lang 中声明的所有公共类型 让我们假设以下代码 package com example p
  • jQuery 日期时间选择器 MVC3

    我的模型中有这个字段 DataType DataType DateTime Required ErrorMessage Expire is required public DateTime Expire get set 在我看来 Html
  • 在 JavaScript 中定义全局对象的独立于实现的版本

    我正在尝试定义globalJavaScript 中的对象在一行中如下所示 var global this global this 上述声明是在全局范围内的 因此在浏览器中this指针是一个别名window目的 假设它是在当前网页上下文中执行
  • 将 key=value 对转换回 Python 字典

    有一个日志文件 其中的文本以空格分隔key value对 每行最初都是从 Python 字典中的数据序列化的 类似于 join f k v r for k v in d items 键始终只是字符串 这些值可以是任何值ast literal
  • Keras 自定义指标迭代

    我对 Keras 还很陌生 我正在尝试定义自己的指标 它计算一致性指数 这是回归问题的度量 def cindex score y true y pred sum 0 pair 0 for i in range 1 len y true fo
  • 如何在 Angular/ionic 网站中实施 AMP?

    最近我听说了 Accelerated Mobile Pages 项目 并阅读了一些有关它的信息 我想知道如何为基于 Ionic 和 Angular 构建的现有网站实现它 基本上没有几乎可能的解决方案可以做到这一点 如果你检查文档here 让
  • Android Studio 无法启动

    安装Android Studio后 我启动了它 但它没有开始 我打开任务管理器看到多了两个执行顺序 Cmd exe and conhost exe 我的系统版本是Windows 7 Ultimate 64bit 有什么想法如何解决这个问题吗
  • 在 Web API / APIController 中控制序列化

    在 ASP NET Web API 中哪里可以指定自定义序列化 反序列化 我们应用程序的吞吐量需要消息的快速序列化 反序列化 因此我们需要严格控制这部分代码以使用我们的自制程序或 OSS 我检查了各种来源 例如this这解释了如何创建自定义
  • 当注释有参数时,CDI 拦截器不起作用

    我正在尝试实现一个 Restricted注释 以用户只有在登录并具有特定角色时才能访问它们的方式保护控制器方法 我在 Tomcat 7 上使用 JSF 和 CDI 所以没有 EJB 只要注释接口不指定任何参数 拦截器就会被调用 一旦我添加一