详解Struts2拦截器机制

详解Struts2拦截器机制

1. 什么是Struts2拦截器

Struts2拦截器是一个非常重要的组件,用于对请求进行拦截和处理,同时也是整个Struts2框架的核心。

在Struts2中,每个请求都会经过多个拦截器的处理,每个拦截器只是完成了部分工作,多个拦截器组合在一起,最终完成了一个完整的请求处理流程。

2. Struts2拦截器机制的流程

Struts2拦截器机制的流程如下:

  1. 请求发起:当用户在浏览器中输入URL,请求到达Struts2 Controller时,请求被拦截器拦截。

  2. 拦截器链:所有的拦截器按照Struts.xml中定义的顺序组成拦截器链。拦截器链是一个有序集合,按照定义的顺序执行。

  3. 执行拦截器:拦截器链中的每个拦截器都会执行自己的逻辑,并将请求传递给下一个拦截器。

  4. Action执行:当拦截器链中的所有拦截器执行完成后,请求最终被传递给Action,Action执行自己的逻辑。

  5. 结果返回:Action执行完成后,结果被返回给拦截器链,拦截器链进行后续处理,最终将结果返回给浏览器。

3. Struts2拦截器的分类

Struts2拦截器根据其功能和执行位置的不同,可以分为以下几类:

  1. 控制拦截器(Control Interceptor):决定是否执行Action。如:params、prepare、validation、workflow等。

  2. 工作流拦截器(Workflow Interceptor):用于工作流控制,如:exception、debug、profiling等。

  3. 处理拦截器(Execution Interceptor):管理Action执行流程,如:action、result等。

  4. 输入拦截器(Input Interceptor):管理如何将请求参数绑定到Action属性中。

  5. 输出拦截器(Output Interceptor):将Action的执行结果转换为最终的输出格式。

  6. 安全拦截器(Security Interceptor):管理一个请求是否可被理解为受控请求,使用安全拦截器可以配置哪些请求进行安全控制,如:authentication、authorization等。

4. 示例1:自定义拦截器

下面以示例的形式,演示如何自定义一个控制拦截器。

  1. 创建拦截器类:示例中使用java类实现拦截器。
public class CustomInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("Interceptor destroyed");
    }

    @Override
    public void init() {
        System.out.println("Interceptor initialized");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Interceptor invoked");
        return invocation.invoke();
    }
}
  1. 在struts.xml中配置自定义拦截器:
<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="custom" class="com.example.interceptor.CustomInterceptor"/>
        <interceptor-stack name="myStack">
            <interceptor-ref name="custom"></interceptor-ref>
            <interceptor-ref name="params"></interceptor-ref>
            <interceptor-ref name="validationWorkflowStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
</package>
  1. 使用拦截器:使用在Struts.xml中定义的自定义拦截器。
<action name="login" class="com.example.action.LoginAction" method="login">
    <interceptor-ref name="myStack"></interceptor-ref>
    <result name="success">welcome.jsp</result>
</action>

5. 示例2:使用Struts2内置拦截器实现表单验证

下面以示例的形式,演示如何使用Struts2内置拦截器实现表单验证。

  1. 编写Action
public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        if(username.equals("admin") && password.equals("admin123")) {
            return SUCCESS;
        }
        else {
            addActionError(getText("error.login"));
            return INPUT;
        }
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}
  1. 配置struts.xml:
<action name="login" class="com.example.action.LoginAction" method="execute">
    <result name="input">/login.jsp</result>
    <result name="success">/welcome.jsp</result>
    <interceptor-ref name="defaultStack">
        <param name="validation.excludeMethods">execute</param>
    </interceptor-ref>
</action>
  1. 在JSP中使用标签库实现前端验证
<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
    <s:textfield name="username" label="username" />
    <s:password name="password" label="password" />
    <s:submit value="login" />
</s:form>

在以上示例中,通过配置defaultStack拦截器完成了表单验证的功能。参数validation.excludeMethods指定了执行Action的方法不应该进行表单验证。在login.jsp中,通过使用struts标签库,可以实现前端验证的功能。

6. 总结

了解Struts2拦截器机制可以帮助我们更好的掌握Struts2框架,并实现更灵活的工作流程。Struts2提供了许多内置的拦截器,同时也可以通过自定义拦截器来满足个性化需求。

阅读剩余 71%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Struts2拦截器机制 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Cloud升级最新Finchley版本的所有坑

    Spring Cloud升级最新Finchley版本的所有坑 升级Spring Cloud版本是一个具有一定挑战性的任务,本篇文章主要介绍在升级Spring Cloud到最新版本Finchley时的几个注意事项及相关解决方案。 1. 升级前的准备工作 在升级Spring Cloud前,需要先了解当前的Spring Boot版本与Spring Cloud版本之…

    Java 2023年5月20日
    00
  • JSP 防范SQL注入攻击分析

    完整的JSP防范SQL注入攻击分析过程如下: 1.了解SQL注入攻击 首先,要了解什么是SQL注入攻击。SQL注入攻击是黑客利用应用程序的安全漏洞,将恶意的SQL代码插入到应用程序的SQL语句中,以获得非法的数据库访问权限。在JSP应用程序中,如果不对用户提交的请求进行适当的过滤和验证,那么黑客就有可能通过SQL注入攻击来破坏应用程序的安全性。 2.使用预编…

    Java 2023年6月15日
    00
  • Atomic类的作用是什么?

    Atomic类是Java中原子性操作的一个封装类,可以用于无锁操作,避免多线程竞争问题。它提供了一组原子操作,具有以下三个特征:原子性、有序性和线程安全性。Atomic类对于高并发场景下的数据修改操作具有很大的帮助作用,可以提高程序的性能和稳定性。 在使用Atomic类时,常见的操作包括get获取当前值、set设置新值、compareAndSet(预期值,更…

    Java 2023年5月10日
    00
  • 教你使用springboot配置多数据源

    使用SpringBoot配置多数据源,需要先在pom.xml文件中添加对jdbc和mysql-connector-java的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-j…

    Java 2023年5月20日
    00
  • 送电子书福利啦!

    过去若干年,一边工作编程,一边思考提炼,写了一些关于“写整洁业务代码”的文章,在随笔分类“代码修行”下。有一天在公司文档空间分享时,突然想到:可以制作一本电子书,将过往的重要经验总结起来,也是对自己十年编程生涯的一个阶段性回顾,作为继续前进的阶梯。 我的第一本电子书 书名:《代码修行:一步一步写出整洁的业务代码》 链接: https://pan.baidu.…

    Java 2023年5月7日
    00
  • JAVA实现扫描线算法(超详细)

    JAVA实现扫描线算法(超详细)攻略 什么是扫描线算法 扫描线算法是一种在计算机图形学中应用广泛的算法,用于处理一个给定的边缘多边形。常见的使用场景包括:计算面积、求交集、裁剪等等。 扫描线算法的基本思路是将多边形沿着y轴方向切分成若干个互不相交的线段。然后从最小y值的线段开始按照y值升序排序,把线段依次加入扫描线列表。不断扫描y轴,每扫描到一个y值点就删去…

    Java 2023年5月19日
    00
  • JDBC数据库连接过程及驱动加载与设计模式详解

    下面是对于“JDBC数据库连接过程及驱动加载与设计模式详解”的完整攻略: JDBC数据库连接过程 JDBC是JavaEE标准中定义的用于操作各种关系型数据库的API。使用JDBC连接到数据库的过程如下: 加载数据库驱动:使用Class.forName(driver)加载对应数据库的驱动类,其中driver是JDBC提供的数据库驱动类名。例如,连接MySQL数…

    Java 2023年5月20日
    00
  • Java异常处理的机制是什么?

    Java异常处理机制是一种处理程序错误的方式。在Java程序运行时,如果程序出现错误(如除0、数组下标越界等),程序会抛出一个异常对象。此时,Java会尝试查找能够处理该异常的异常处理程序,若找到则执行该处理程序,若没有找到则程序终止并输出堆栈跟踪信息。 Java异常处理机制主要分为异常抛出、异常捕获和异常处理三个部分。 1.异常抛出 在Java中,异常是以…

    Java 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部