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

  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 将 list 字符串用逗号隔开拼接字符串的多种方法

    下面是详细讲解“java 将 list 字符串用逗号隔开拼接字符串的多种方法”的完整攻略: 1. 使用 StringJoiner 在 Java 8 中新增了 StringJoiner 类,可以方便地将集合中的元素用指定的分隔符拼接成字符串。示例代码如下: List<String> list = new ArrayList<>(); l…

    Java 2023年5月27日
    00
  • SpringBoot2新特性 自定义端点详解

    Spring Boot 2新特性自定义端点详解 Spring Boot 2引入了许多新特性,其中之一是自定义端点。自定义端点是一种用于公开应用程序信息的机制,可以通过HTTP或JMX访问。在本文中,我们将详细介绍Spring Boot 2的自定义端点,并提供两个示例。 自定义端点 Spring Boot 2的自定义端点是通过实现Endpoint接口来实现的。…

    Java 2023年5月15日
    00
  • 什么是Java网络编程?

    Java网络编程,简称Java网络编程,是指使用Java编程语言实现网络通信的过程。它可以让我们实现客户端与服务器之间的通信,以及实现不同计算机之间的数据传输。下面介绍Java网络编程的完整使用攻略。 一、Java网络编程基础 Java网络编程基础主要包含以下几个内容: IP地址:Internet Protocol(IP)地址是计算机在网络上的唯一标识符。在…

    Java 2023年5月11日
    00
  • Spring Security 中如何让上级拥有下级的所有权限(案例分析)

    什么是Spring Security Spring Security是一个基于Spring框架提供的安全性解决方案,实现了通用的安全功能,例如身份验证、授权、加密等等。它提供了一组用于Web应用程序中的库和API,以便实现许多常见的安全场景,以及为自定义安全需求提供支持的扩展点。 Spring Security中如何让上级拥有下级的所有权限 在Spring …

    Java 2023年5月20日
    00
  • JAVA 内部类详解及实例

    JAVA 内部类详解及实例 Java内部类可以看作是一种定义在另一个类内部的类。它们有访问外部类的所有成员的权限。Java内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。 成员内部类 成员内部类定义在外部类的内部,并且不是static类型的。成员内部类可以直接访问外部类的成员变量和方法,并且可以通过this关键字访问自己的成员变量和方法。…

    Java 2023年5月26日
    00
  • 利用Maven入手Spring Boot第一个程序详解

    利用 Maven 入手 Spring Boot 第一个程序的攻略,可以分为以下几个步骤: 步骤一:创建项目 打开 IntelliJ IDEA 软件,选择 “New Project”。 选择 “Spring Initializr” 选项,然后点击 “Next”。 在 “Project SDK” 下拉框中选择相应的 JDK 版本,然后点击 “Next”。 输入项…

    Java 2023年5月20日
    00
  • Sprint Boot @Cacheable使用方法详解

    Spring Boot的@Cacheable注解 在Spring Boot中,@Cacheable注解用于启用缓存支持。使用@Cacheable注解可以将方法的返回值缓存起来,并在下一次调用该方法时直接返回缓存的结果,而不是再次执行该方法。本文将详细介绍@Cacheable注解的作用和使用方法,并提供两个示例说明。 @Cacheable注解作用 在Sprin…

    Java 2023年5月5日
    00
  • 解析javascript 数组以及json元素的添加删除

    要解析JavaScript数组和JSON元素的添加和删除,我们需要做以下几个步骤: 1. 创建一个数组或JSON对象 首先,我们需要创建一个空的数组或JSON对象。 创建数组 let myArray = []; 创建JSON对象 let myJSON = {}; 2. 向数组或JSON对象中添加元素 添加元素是一种常见的操作,我们可以使用数组的push()方…

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