Java EE中的拦截器是什么?

60

我想澄清一下Java EE中的拦截器的概念。我已经阅读了Java EE规范,但是还是有些困惑。请提供一些能够澄清这个概念的有用链接或教程。我们何时、为什么使用拦截器?


5
请查看官方教程中有关拦截器的章节(http://docs.oracle.com/javaee/6/tutorial/doc/gkigq.html),其中还包含一个可直接运行的示例,展示了如何在无状态Bean上使用拦截器。请参考。 - fvu
4个回答

64
拦截器用于实现横切关注点,如日志记录、审计和安全性,从业务逻辑中进行。在Java EE 5中,仅允许在EJB上使用拦截器。在Java EE 6中,拦截器成为了自己的新规范,抽象到更高的级别,以便更通用地应用于平台中更广泛的规范。它们拦截与目标类相关联的调用和生命周期事件。基本上,拦截器是一个类,当在目标类上调用业务方法、发生创建/销毁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


19

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

我们可以使用@Interceptor注释将拦截器附加到我们的类上。 每当调用我们类中的方法时,附加的拦截器都会拦截该方法调用并执行其拦截方法 (interceptor method)。(请参见下面的示例,可通过@AroundInvoke注释实现)

Method Interceptors

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

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

拦截器的常见用途包括日志记录、审计和性能分析。

更详细的介绍,请阅读这篇文章: https://abhirockzz.wordpress.com/2015/01/03/java-ee-interceptors/


10

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

在其他情况下,它们可以用于需要检查客户端是否有权或清除权限来执行数据库中特定对象上的事务。 这就是拦截器发挥作用的地方; 它们可以检查客户端/用户是否具有该权限,通过检查他/她是否可以在该数据库对象或EJB上调用该方法。

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


-2
你可以使用拦截器(Interceptor)在向控制器类发送请求之前以及向响应发送请求之前执行一些任务。比如,如果你想在向控制器类发送请求之前验证身份令牌,那么你可以使用拦截器。 示例代码:
@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.
    }
}

1
这个答案有什么问题? - R Nanthak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接