Struts2实现对action请求对象的拦截操作方法

yizhihongxing
  1. Struts2的拦截器机制

Struts2采用拦截器机制来对用户发出的请求进行拦截、处理和响应。拦截器是一组批处理过程,你可以在任何一个拦截器中编写你自己的代码,来处理对应的请求。例如,对于用户登录请求,可以通过拦截器机制进行身份验证。

  1. 实现对action请求对象的拦截操作

通过写一个继承自Interceptor抽象类的拦截器,并实现intercept方法,来实现对action请求对象的拦截操作。

以下是实现拦截器的步骤:

  1. 创建一个类并继承Interceptor抽象类。
  2. 实现intercept方法。在该方法中,可以获取当前的ActionContext上下文,然后从中获取请求对象和响应对象,并对其进行相应的操作。
  3. struts.xml配置文件中,配置拦截器及其拦截范围。

下面是一个示例,在Struts2中,实现对请求中的参数进行身份验证:

public class AuthenticationInterceptor implements Interceptor {
    public void destroy() {}

    public void init() {}

    public String intercept(ActionInvocation invocation) throws Exception {
        Map<String, Object> session = invocation.getInvocationContext().getSession();
        User user = (User) session.get("user");

        if (user == null) {
            return "login";
        } else {
            ActionProxy proxy = invocation.getProxy();
            String method = proxy.getMethod();
            Object action = invocation.getAction();
            String[] parameterNames = ((HandlerMethodAction) action).getParameters();  //获取请求参数

            /*对请求中的参数进行验证*/
            if (parameterNames != null && parameterNames.length > 0) {
                for (String paramName : parameterNames) {
                    String paramValue = invocation.getInvocationContext().getParameters().get(paramName)[0];
                    if (!StringUtils.isNumeric(paramValue)) {
                        return "error";  // 非法参数
                    }
                }
            }

            return invocation.invoke();
        }
    }
}

struts.xml配置文件中,配置拦截器及其拦截范围:

<interceptors>
    <interceptor name="authentication"
                 class="com.example.AuthenticationInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="authentication"/>
        <interceptor-ref name="params"/>  // 需要先执行params拦截器,才能获取到请求参数
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="validation"/>
        <interceptor-ref name="workflow"/>
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="defaultStack"/>

<action name="foo" class="com.example.FooAction">
    <interceptor-ref name="defaultStack"/>
    <result name="success">/result.jsp</result>
</action>

另一个示例,可以实现对请求进行日志记录:

public class LoggingInterceptor implements Interceptor {
    public void destroy() {}

    public void init() {}

    public String intercept(ActionInvocation invocation) throws Exception {
        long startTime = System.currentTimeMillis();  // 记录开始时间

        /*在action执行前的逻辑*/
        String result = invocation.invoke();

        /*在action执行后的逻辑*/
        long endTime = System.currentTimeMillis();  // 记录结束时间
        long executeTime = endTime - startTime;  // 计算action执行时间

        String className = invocation.getAction().getClass().getName();
        String methodName = invocation.getProxy().getMethod();

        System.out.println(String.format("Class %s, Method %s, Execute Time: %dms", className, methodName, executeTime));

        return result;
    }
}

struts.xml配置文件中,配置拦截器及其拦截范围:

<interceptors>
    <interceptor name="logging"
                 class="com.example.LoggingInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="logging"/>
        <interceptor-ref name="params"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="validation"/>
        <interceptor-ref name="workflow"/>
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="defaultStack"/>

<action name="foo" class="com.example.FooAction">
    <interceptor-ref name="defaultStack"/>
    <result name="success">/result.jsp</result>
</action>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2实现对action请求对象的拦截操作方法 - Python技术站

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

相关文章

  • Java Fluent Mybatis 聚合查询与apply方法详解流程篇

    Java Fluent Mybatis 是一个 Mybatis 的扩展项目,它提供了一组高级的 API ,可以让你更加简洁、方便地构建 MyBatis 动态 SQL 查询语句。 Fluent Mybatis 中关于聚合查询的 API 章节是 Fluent-SQL-Query 的一个子集,主要提供了以下三个聚合查询的方法: groupBy: 根据列进行分组 h…

    Java 2023年5月20日
    00
  • SpringDataRedis入门和序列化方式解决内存占用问题小结

    下面就是关于“SpringDataRedis入门和序列化方式解决内存占用问题小结”的完整攻略。 SpringDataRedis入门 什么是Redis? Redis(Remote Dictionary Server)是一个开源的基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构,如字符串(strings)、哈希(ha…

    Java 2023年5月20日
    00
  • java环境中的JDK、JVM、JRE详细介绍

    JDK、JVM、JRE介绍 在学习Java编程语言时,经常会听到JDK、JVM、JRE这几个概念。那么,这些概念的具体含义是什么呢? JDK(Java Development Kit):Java开发工具包。JDK是Java开发的核心组件,包含了Java编译器、Java运行环境、Java类库等一系列组件。 JRE(Java Runtime Environmen…

    Java 2023年5月24日
    00
  • Java中session存储Users对象实现记住密码

    当我们使用Java web开发时,常使用session来存储用户的信息以便在整个会话期间使用。如果想要实现记住密码功能,则需要将用户的用户名与密码存储在session对象中,并设置session的有效时间。下面是实现过程的完整攻略。 第一步:创建一个登录页面 首先我们需要创建一个登录页面,该页面包含一个用户名和密码的输入框以及一个“记住密码”的复选框。当用户…

    Java 2023年5月20日
    00
  • 什么是Java永久代(PermGen)?

    Java永久代(PermGen)是Java虚拟机(JVM)中的一部分,它是用于存储类和静态变量等元数据的特殊区域。下面将对Java永久代进行详细的使用攻略。 标题一:Java永久代的概念 什么是Java永久代? Java永久代是JVM的一部分,用于存储Java类的元数据和静态变量。与Java堆不同,永久代的生命周期与JVM相同。在JVM启动时,会预先分配一定…

    Java 2023年5月11日
    00
  • Java RSA加密解密实现方法分析【附BASE64 jar包下载】

    Java RSA加密解密实现方法分析 本文介绍了Java中RSA加密解密的实现方法。主要讲解了如何生成密钥对、如何进行加密解密、如何将密钥序列化和反序列化等操作。同时为了方便实际开发,我们也提供了BASE64 jar包下载链接。 生成密钥对 首先我们需要使用Java中的KeyPairGenerator类来生成RSA密钥对。代码如下: KeyPairGener…

    Java 2023年5月20日
    00
  • Java对象的内存布局全流程

    Java对象的内存布局是指Java对象在内存中的存储结构,其包含了对象头、实例数据以及对齐填充三个部分。这个过程可以用以下五个步骤来描述: 虚拟机中的对象是如何创建的? 在JVM中,当我们通过new关键字创建一个Java对象时,JVM会在堆内存中为该对象分配一块内存空间,并返回该对象的引用。对象在内存中的存储结构如下所示: Memory |———…

    Java 2023年5月26日
    00
  • 详解java WebSocket的实现以及Spring WebSocket

    关于Java WebSocket的实现以及Spring WebSocket,我可以为您提供以下攻略: 1. 什么是WebSocket? WebSocket是一个协议,可以在客户端和服务器之间建立即时、双向的通信。传统的HTTP协议都是单向的,即客户端请求,服务器响应。但是,随着网页变得更加交互式,出现了一些需要实时双向通信的场景,例如聊天、直播等。于是,We…

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