55

我试图澄清我对 Java EE 中拦截器的概念。我已经阅读了 Java EE 规范,但我对此有点困惑。请为我提供一些有用的链接或教程,以清除我的概念。我们如何、何时、为什么使用拦截器?

4

4 回答 4

60

拦截器用于从业务逻辑中实现横切关注点,例如日志记录、审计和安全性。

在 Java EE 5 中,仅在 EJB 上允许使用拦截器。在 Java EE 6 中,Interceptors 成为了自己的新规范,在更高级别进行了抽象,以便可以更通用地应用于平台中更广泛的规范集。

它们拦截相关目标类上的调用和生命周期事件。基本上,拦截器是一个类,其方法在调用目标类上的业务方法、生命周期事件(例如创建/销毁 bean 的方法)发生或 EJB 超时方法发生时被调用。CDI 规范定义了一种类型安全的机制,用于使用拦截器绑定将拦截器与 bean 相关联。

在以下位置查找工作代码示例:

https://github.com/arun-gupta/javaee7-samples/tree/master/cdi/interceptors

Java EE 7 还在 Java Transaction API 中引入了一个新的 @Transactional 注解。这允许您在 EJB 之外拥有容器管理的事务。这个注解被定义为一个拦截器绑定,并由 Java EE 运行时实现。@Transactional 的工作示例位于:

https://github.com/arun-gupta/javaee7-samples/tree/master/jta/transaction-scope

于 2013-09-18T12:52:36.973 回答
17

拦截器用于向托管 bean添加 AOP 功能。

我们可以使用 @Interceptor 注解将 Interceptor 附加到我们的类中。 每当调用我们类中的方法时,附加的拦截器将拦截该方法调用并执行其拦截器方法。

这可以使用 @AroundInvoke 注释来实现(参见下面的示例)。

方法拦截器

我们可以使用@AroundConstruct 注解拦截类的生命周期事件(对象创建、销毁等)。

拦截器和Servlet 过滤器之间的主要区别是我们可以在 WebContext 之外使用拦截器,但过滤器是特定于 Web 应用程序的。

拦截器的常见用途是日志记录、审计和分析。

更详细的介绍可以看这篇文章。 https://abhirockzz.wordpress.com/2015/01/03/java-ee-interceptors/

于 2015-12-02T02:45:03.283 回答
10

我喜欢这个定义:拦截器是拦截对 EJB 方法的调用的组件。它们可用于在访问 EJB 时进行审计和记录。

在另一种情况下,它们可以用于我们需要检查客户端是否有权或许可对数据库中的特定对象执行事务的情况。好吧,这就是拦截器派上用场的地方;他们可以通过检查客户/用户是否可以在该数据库对象或 EJB 上调用该方法来检查客户/用户是否具有该权限。

但是,我仍然会看一下下面的文章和下面的教程,以了解它们是如何在 Java EE 设置/环境中使用的。

于 2013-09-17T16:00:24.070 回答
-2

您可以将 Interceptor 用于在向 Controller 类发送请求之前和向响应发送请求之前要执行某些任务的地方。例如:- 在这种情况下,您想在向 Controller 类发送请求之前验证身份验证令牌,您可以使用拦截器。示例代码:

@Component
public class AuthInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler) throws Exception {
    //Here you can write code to validate the auth token.
    }
}
于 2021-10-23T04:31:48.510 回答