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日

相关文章

  • Eclipse+Webservice简单开发实例

    Eclipse是一款为Java开发者设计的集成开发环境,Webservice是一种基于Web的分布式技术,实现了通过网络进行异构系统之间的通讯和集成。结合Eclipse和Webservice,可以轻松开发出高效、安全、可靠的分布式应用程序。本攻略将介绍如何在Eclipse中使用Webservice进行简单开发,并提供两个示例说明,帮助读者深入了解这项技术。 …

    Java 2023年6月15日
    00
  • JAVA中StackOverflowError错误的解决

    下面是“JAVA中StackOverflowError错误的解决”的完整攻略。 什么是StackOverflowError错误? 在Java程序中,如果方法被递归调用时,方法栈会不断地往系统栈内添加方法栈帧。如果方法递归层数过多,方法栈会撑满,此时就会发生StackOverflowError错误,如下所示: Exception in thread &quot…

    Java 2023年5月27日
    00
  • JSP+Servlet+JavaBean实现登录网页实例详解

    让我来为你详细讲解关于“JSP+Servlet+JavaBean实现登录网页实例”的攻略。本攻略主要包括以下内容: 环境搭建 创建登录页面 编写Servlet 编写JavaBean 实现功能 示例说明 1. 环境搭建 首先,我们需要准备好环境。在开始之前,确保你已经完成以下准备工作: 安装好Java开发环境,包括JDK和IDE(例如Eclipse、Intel…

    Java 2023年6月15日
    00
  • 序列化实现对象的拷贝

    提到拷贝,大家第一时间想到的可能都是克隆模式的深克隆,因为这个模式在面试中出现的机率非常高,同时实现的方式也比较容易:对象的类实现Cloneable接口并且重写clone()方法即可。但是在实际情况中克隆模式有时候其实并不适合用来拷贝对象,因为如果有很多的实体类都需要拷贝,这个时候难道把这些实体类全都实现克隆模式?这是不提倡的,这个时候可以使用序列化方式来实…

    Java 2023年4月19日
    00
  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码 Java 11于2018年9月正式发布,带来了一些令人兴奋的新特性和功能。在本文中,我们将介绍Java 11的八个强大的新特性,并给出一些示例,以帮助您更好地理解它们的使用方式。 1. HttpClient API Java 11引入了一个全新的HTTP客户端API,该API支持异步和基于事…

    Java 2023年5月20日
    00
  • Mybatis在注解上如何实现动态SQL

    Mybatis支持在注解上实现动态SQL。在注解中使用动态SQL,可以使代码更加简洁,易于维护。下面是Mybatis在注解上实现动态SQL的攻略: 前置条件 使用Mybatis在注解上实现动态SQL,需要先引入Mybatis框架和Mybatis-Spring,同时还需要在mybatis-config.xml中配置相关参数。 实现步骤 1. 创建Mapper接…

    Java 2023年5月20日
    00
  • Java超详细讲解ArrayList与顺序表的用法

    Java超详细讲解ArrayList与顺序表的用法 什么是ArrayList和顺序表? ArrayList是Java中常见的集合类之一,是一个可变长的数组,具有快速的随机访问能力。 顺序表是一种线性结构,是一种物理上连续的存储结构,它的每一个元素都占用一个固定大小的空间。 ArrayList和顺序表的区别 ArrayList是动态的,不需要预先分配空间,当存…

    Java 2023年5月26日
    00
  • 解决spring security中遇到的问题

    解决 Spring Security 中遇到的问题攻略 Spring Security是Spring框架中应用广泛的安全框架,但在使用中经常会遇到一些问题。本攻略将从常见问题入手,为你提供解决方案。 问题一:认证授权失败 在使用Spring Security的过程中,经常会遇到认证授权失败的问题。处理这类问题需要对 Spring Security 的认证流程…

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