struts2过滤器和拦截器的区别分析

针对网站的访问安全问题,很多网站采取了过滤器和拦截器的方法来进行控制,而在struts2框架中也存在两种安全控制机制:过滤器(Filter)和拦截器(Interceptor)。下面,我将从以下几个方面对这两种机制进行分析,希望对你有所帮助。

过滤器(Filter)和拦截器(Interceptor)的概念

过滤器(Filter)是一种Servlet技术,可以拦截请求和响应、修改请求和响应、重定向请求和响应等,并将修改后的请求和响应转发给下一个Servlet或JSP。即:它是在Web应用程序中为了在处理请求之前或之后执行某些任务而存在的组件。

而拦截器(Interceptor)则是一种AOP思想的产物,它位于Action和Web服务器之间,可以对Action的调用进行拦截,以完成一些与请求相关的预处理或后处理任务。拦截器可以对Action进行统一控制,如:实现日志记录、权限控制、事务控制等。

过滤器(Filter)和拦截器(Interceptor)的区别

  1. 触发时机不同:过滤器在请求之前或之后执行,直接处理HTTP请求和响应;而拦截器则在Action处理请求时执行,只处理Action相关的请求,不可以直接处理HTTP请求和响应。

  2. 执行顺序不同:过滤器的执行顺序是由其在web.xml文件中的顺序决定的,而拦截器则可以通过定义在struts.xml文件中的拦截器栈(Interceptor Stack)来指定执行顺序,即可以通过改变拦截器栈中的顺序来改变拦截器的执行顺序。

  3. 作用范围不同:过滤器可以对所有的Web资源进行拦截,如JSP、HTML、图片等;而拦截器只能对Action进行拦截。

过滤器(Filter)和拦截器(Interceptor)的使用场景

  1. 过滤器(Filter)的应用场景主要用于过滤输入内容,或者对请求进行安全控制等操作。比如:限制某些IP访问Web资源、屏蔽冗余的HTML代码、防止XSS攻击、防止SQL注入等。

  2. 拦截器(Interceptor)的应用场景主要是在开发时进行系统设计、重构或者业务增强。比如:进行日志记录、进行性能监控、对特定用户进行权限控制等。

示例一:使用过滤器实现防止SQL注入攻击

在web.xml文件中定义过滤器:

<filter>
    <filter-name>sqlFilter</filter-name>
    <filter-class>com.example.servlet.SQLFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sqlFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

编写SQLFilter.java文件:

public class SQLFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        // 参数预处理:替换掉特殊字符
        String keyword = req.getParameter("keyword");
        keyword = keyword.replaceAll("(?i)delete", "").replaceAll("(?i)update", "");
        req.getParameterMap().put("keyword", new String[] { keyword });
        chain.doFilter(req, resp);
    }
    @Override
    public void destroy() {
    }
}

示例二:使用拦截器统一处理日志记录

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

<struts>
    <constant name="struts.custom.i18n.resources" value="i18n" />
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="logInterceptor" class="com.example.interceptor.LogInterceptor" />
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="logInterceptor" />
                <interceptor-ref name="defaultInterceptor" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="defaultStack" />
        <result-types>
            <result-type name="dispatcher" default="true"
                class="org.apache.struts2.dispatcher.ServletDispatcherResult" />
        </result-types>
        <action name="index" class="com.example.action.IndexAction">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

编写LogInterceptor.java文件:

public class LogInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;
    @Override
    public void destroy() {
    }
    @Override
    public void init() {
    }
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 执行前处理
        String actionName = invocation.getInvocationContext().getName();
        long startTime = System.currentTimeMillis();
        // 执行Action
        String result = invocation.invoke();
        // 执行结果处理
        long endTime = System.currentTimeMillis();
        System.out.println("Action:" + actionName + ",执行时间:" + (endTime - startTime) + "ms");
        return result;
    }
}

以上就是关于struts2过滤器和拦截器的区别分析及两个示例的攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2过滤器和拦截器的区别分析 - Python技术站

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

相关文章

  • 微信小程序中如何计算距离某个节日还有多少天

    为了计算距离某个节日还有多少天,我们需要进行如下步骤: 1.获取当前时间 可以使用JavaScript中的Date对象来获取当前时间,通过调用Date类的构造器或静态方法即可完成,例如下面的代码实现获取当前时间: let currentTime = new Date(); 获取指定日期 我们可以通过手动指定特定日期来获取特定日期的Date对象,例如下面这段代…

    Java 2023年5月23日
    00
  • dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter

    下面详细讲解“dubbo将异常转换成RuntimeException的原因分析 ExceptionFilter”的完整攻略。 1. 什么是 ExceptionFilter ExceptionFilter 是 Dubbo 服务框架中的一个异常过滤器(Exception Filter),用于将 Dubbo 异常转换成 Spring 框架的异常,以便将 Dubbo…

    Java 2023年5月27日
    00
  • 关于SpringBoot单元测试(cobertura生成覆盖率报告)

    下面我详细讲解关于SpringBoot单元测试以及cobertura生成覆盖率报告的攻略。 什么是单元测试 单元测试是一种测试方法,该方法用于测试软件设计的最小单位——单元。在Java中,一个单元通常指的是一个方法。单元测试通常是在开发过程中进行的,以确保代码的每个部分都经过了适当的测试。单元测试通常是在代码完成之前进行,并且可以使用自动化测试工具进行。 S…

    Java 2023年5月19日
    00
  • Java中线程上下文类加载器超详细讲解使用

    Java中线程上下文类加载器超详细讲解使用 前言 在Java多线程中,经常会出现跨类加载器的情况,例如Web容器中的应用程序的类加载器和Java线程在使用的类加载器可以是不同的实例。而在Java中,不同的类加载器对于同一个类的加载得到的Class对象实例是不同的,这样就会导致在不同的类加载器中创建的对象实例无法相互转换,从而引发一系列问题。为此,Java中引…

    Java 2023年5月19日
    00
  • 快速建立Servlet和JSP的运行、调试和编译环境

    快速建立Servlet和JSP的运行、调试和编译环境的攻略如下: 环境准备 安装JDK 前往Oracle官网下载JDK安装包(根据操作系统和位数选择相应版本):https://www.oracle.com/technetwork/java/javase/downloads/index.html 下载完成后,按照安装提示进行安装并配置环境变量。 安装Tomca…

    Java 2023年5月19日
    00
  • java枚举类的构造函数实例详解

    Java枚举类的构造函数实例详解 Java中的枚举类是一种特殊的数据类型,它可以用来定义常量集合。除了常见的静态枚举类常量定义之外,枚举类还可以定义方法、属性和构造函数。在本文中,我们详细讨论了Java枚举类的构造函数实例,包括构造函数的定义、使用示例以及注意事项等内容。 枚举类的构造函数定义 枚举类的构造函数可以用来初始化枚举常量的属性。枚举类的构造函数定…

    Java 2023年5月26日
    00
  • 使用jmx exporter采集kafka指标示例详解

    以下是关于使用jmx exporter采集kafka指标的完整攻略: 什么是 JMX Exporter? JMX Exporter 是一个自动化采集系统监控指标并将其解析为 Prometheus 指标格式的工具。它允许用户将 JMX 暴露出来的数据转换成 Prometheus 支持的文本格式。 使用 JMX Exporter 采集 Kafka 指标 以下是使…

    Java 2023年5月20日
    00
  • java进行文件读写操作详解

    Java进行文件读写操作详解 概述 Java支持文件的读写操作,通过读写文件能够实现各种常见的功能,比如读取配置文件、写入日志等。文件读写的过程中我们需要使用到Java中的IO类库,主要包括InputStream、OutputStream、Reader和Writer等。其中InputStream和OutputStream主要用于读写字节数据,Reader和W…

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