我试图澄清我对 Java EE 中拦截器的概念。我已经阅读了 Java EE 规范,但我对此有点困惑。请为我提供一些有用的链接或教程,以清除我的概念。我们如何、何时、为什么使用拦截器?
4 回答
拦截器用于从业务逻辑中实现横切关注点,例如日志记录、审计和安全性。
在 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
拦截器用于向托管 bean添加 AOP 功能。
我们可以使用 @Interceptor 注解将 Interceptor 附加到我们的类中。 每当调用我们类中的方法时,附加的拦截器将拦截该方法调用并执行其拦截器方法。
这可以使用 @AroundInvoke 注释来实现(参见下面的示例)。
我们可以使用@AroundConstruct 注解拦截类的生命周期事件(对象创建、销毁等)。
拦截器和Servlet 过滤器之间的主要区别是我们可以在 WebContext 之外使用拦截器,但过滤器是特定于 Web 应用程序的。
拦截器的常见用途是日志记录、审计和分析。
更详细的介绍可以看这篇文章。 https://abhirockzz.wordpress.com/2015/01/03/java-ee-interceptors/
您可以将 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.
}
}