💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 Struts2中的interceptor它是基于spring aop思想,而aop思想它本质上是通过动态代理来实现。我们strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作。 拦截器链(拦截器栈)简单说,就是可以将多个拦截器形成一个链,在访问它们时依次访问 执行的过程: 当我们发送请求访问Action时,会被StrutsPrepareAndExecuteFilter拦截 在其doFilter方法内执行了 ~~~ execute.executeAction(request, response, mapping); ~~~ 这个代码执行后 ~~~ dispatcher.serviceAction(request, response, mapping); ~~~ serviceAction方法执行 在这个方法执行过程中会创建Action代理对象 ~~~ ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false); ~~~ 通过proxy去执行了`proxy.execute();` 在execute方法内 ~~~ return invocation.invoke(); ~~~ invocation它是ActionInvocation一个对象 在invoke方法内 ![](https://box.kancloud.cn/bde66c479db7864056a19d215ce4982c_1362x380.png) 会去加载我们的配置文件,将配置文件中所有的interceptor得到进行遍历。 在struts-default.xml文件中定义了默认加载的拦截器栈 defaultStack ![](https://box.kancloud.cn/10512576eaf47bb28d49be08d8b7e543_1342x824.png) 在每一个拦截器的interceptor方法内,又调用了DefaultActionInvocation的invoke方法,其实就是递归调用 # Interceptor作用与自定义Interceptor 我们使用interceptor可以在action执行前后进行处理工作。例如,完成权限控制。 问题:如何定义Interceptor? 所有的Interceptor都要实现一个接口 com.opensymphony.xwork2.interceptor.Interceptor 在配置文件中声明Interceptor ![](https://box.kancloud.cn/14facf5856c7ecdba4bfbed4b749011a_1074x138.png) ![](https://box.kancloud.cn/444b0ca8e74d1bfe3effa0d80e39d405_1364x568.png) 在使用时name也可以引入一个interceptor stack. 注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动导入。