📜  Struts 2-拦截器(1)

📅  最后修改于: 2023-12-03 15:20:22.100000             🧑  作者: Mango

Struts 2 拦截器

Struts 2 是一个用于构建 Web 应用程序的开源框架。它是 Struts 框架的升级版,提供了更加灵活、优化的框架结构和更加强大的功能。其中一项重要的功能就是拦截器。

什么是拦截器?

拦截器是 Struts 2 的核心组件之一,它是一种处理 Web 请求的机制。在请求到达 Action 之前,拦截器可以对请求进行预处理和过滤,也可以对请求的响应进行后处理和过滤。拦截器负责在通过过滤器之后,完成对请求或响应的增强处理。

Struts 2 的拦截器机制

在 Struts 2 中,拦截器的机制是基于拦截器栈的。每一个拦截器栈对应着一个 action 或者一个默认的拦截器,这些拦截器栈可以按照一定的规则进行组合和配置。

拦截器的执行过程

当一个请求到达 Struts 2 的容器时,容器会根据请求的 URL 和 struts.xml 配置文件中的定义,找到对应的 ActionConfig。然后容器会将该 ActionConfig 对应的拦截器栈实例化,并将请求进行遍历传递,直到请求被 Action 处理。下图展示了一个拦截器栈的执行过程示意图。

拦截器栈的执行过程

拦截器的类型

在 Struts 2 中提供了多种类型的拦截器,包括以下几种:

  • 过滤器拦截器
  • 拦截器栈拦截器
  • 拦截器引用拦截器
  • 实现 Interceptor 接口的自定义拦截器
过滤器拦截器

Struts 2 引入了 FilterDispatcher,该类实现了 Filter 接口,并且作为一个 Java Servlet 过滤器来工作。FilterDispatcher 是 Struts 2 核心的 Servlet 过滤器,主要功能是将 HTTP 请求转发到 Struts 2 的 Action 中进行处理。

这种类型的拦截器是通过添加在web.xml中配置的来实现的。

<filter>
    <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
拦截器栈拦截器

Struts 2 的拦截器栈拦截器是一种根据配置文件的规则,对请求进行处理的拦截器类型。每个栈由多个拦截器组成,栈顶为首个执行的拦截器,栈底为最后执行的拦截器。

在 struts.xml 文件中定义一个拦截器栈的示例:

<action name="testAction" class="com.tutorial.TestAction">
    <interceptor-ref name="testStack"/>
    <result name="success">success.jsp</result>
    <result name="error">error.jsp</result>
</action>
<interceptor-stack name="testStack">
    <interceptor-ref name="testInterceptor1"/>
    <interceptor-ref name="testInterceptor2"/>
    <interceptor-ref name="testInterceptor3"/>
</interceptor-stack>
拦截器引用拦截器

拦截器引用拦截器是在一个拦截器栈中引用其他拦截器。在创建自己的拦截器栈时,可以使用这种类型的拦截器。

<interceptor name="testInterceptor1" class="com.tutorial.TestInterceptor1" />
<interceptor-ref name="testInterceptor1">
    <param name="param1">param1Value</param>
    <param name="param2">param2Value</param>
</interceptor-ref>
Interceptor 接口的自定义拦截器

特殊的拦截器是自定义拦截器,开发人员可以实现 Interceptor 接口或继承 AbstractInterceptor 抽象类来创建自己的拦截器类。

public class CustomInterceptor implements Interceptor {
    public void init() {
        System.out.println("Initializing Custom Interceptor...");
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext actionContext = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST);

        System.out.println("Custom Interceptor Before: " + request.getRequestURL());

        String result = invocation.invoke();

        System.out.println("Custom Interceptor After: " + result);

        return result;
    }

    public void destroy() {
        System.out.println("Destroying Custom Interceptor...");
    }
}

在 struts.xml 文件中定义自定义的拦截器:

<interceptor name="customInterceptor" class="com.tutorial.CustomInterceptor"/>
拦截器的生命周期

拦截器的生命周期包括初始化、拦截请求和销毁三个阶段。拦截器在容器启动时初始化,在拦截请求时执行,并在容器关闭时销毁。

  • init() 方法:该方法在拦截器被容器实例化时调用,一般在该方法中完成拦截器的初始化工作。
  • intercept() 方法:该方法是拦截器的核心处理方法,控制拦截器在请求被处理前和处理后进行处理的行为。
  • destroy() 方法:该方法在容器关闭时调用,一般在该方法中完成拦截器的清理工作。
总结

Struts 2 的拦截器机制为应用程序开发带来了很大的灵活性和扩展性,并且可以根据不同的应用场景创建不同类型的拦截器。理解 Struts 2 的拦截器机制以及如何创建自定义的拦截器,在开发 Web 应用程序时是非常有帮助的。