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日

相关文章

  • springboot 传参校验@Valid及对其的异常捕获方式

    下面我来详细讲解一下“springboot 传参校验@Valid及对其的异常捕获方式”的完整攻略。 1. 什么是@Valid注解 Spring Boot 在处理 Web 请求时,通常会使用数据绑定将请求中的数据映射到 Controller 中的方法参数列表里。当数据格式不正确或缺失时,我们往往会在方法中手动校验数据,这会增加开发的耗时,也容易产生错误。而@V…

    Java 2023年5月27日
    00
  • Java switch 语句如何使用 String 参数

    Java中的switch语句通常用于针对不同的情况执行不同的操作,常用于替代多个if-else语句的情况。在早期版本中,switch语句只支持整数和枚举类型的参数,但从Java 7版本开始,可以使用字符串参数。下面详细描述如何在Java switch语句中使用字符串参数: 1. switch语句如何使用String类型的参数 为了使用字符串参数,可以在Jav…

    Java 2023年5月27日
    00
  • Java的Struts框架报错“ActionNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionNotFoundException”错误。这个错误通常由以下原因之一起: Action配置问题:如果Action配置不正确,则可能会出现此。在这种情况下,需要检查Action配置以解决此问题。 URL路径问题:如果URL路径不正确,则可能会出现此。在这种情况下,需要检查URL路径以解决此问题。 以下…

    Java 2023年5月5日
    00
  • java实现简单猜拳小游戏

    Java实现简单猜拳小游戏攻略 本文旨在介绍如何使用Java语言实现一个简单的猜拳小游戏。在本文中,我们将涉及如何实现游戏逻辑,如何获取用户输入以及如何进行游戏界面的展示。接下来将详细介绍这些内容。 实现游戏逻辑 在猜拳游戏中,玩家与计算机进行猜拳比赛并决定胜负。为了实现这个过程,我们可以使用Java中的随机数来模拟计算机的猜拳选择,并根据玩家选择和计算机选…

    Java 2023年5月19日
    00
  • JavaScript 函数replace深入了解

    JavaScript 函数replace深入了解 什么是replace函数? replace()是 JavaScript 内置函数之一,它用于在字符串中替换与某个模式匹配的子字符串。replace()函数有两个参数,第一个参数是要替换的内容,可以是字符串或 正则表达式 ;第二个参数是新内容。 语法 string.replace(searchValue, re…

    Java 2023年6月15日
    00
  • Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码

    下面是详细的讲解“Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码”的攻略。 1. Spring Security简介 Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,与 Spring 应用程序无缝集成,具有广泛的可用插件和扩展点以满足几乎任何身份验证和授权要求。Spring Se…

    Java 2023年5月20日
    00
  • spring boot实现超轻量级网关的方法(反向代理、转发)

    下面我将为您详细讲解“springboot实现超轻量级网关的方法(反向代理、转发)”的完整攻略,并且会提供两条示例。 一、什么是网关 网关,即API Gateway,是Web应用程序的入口,起到了路由、反向代理、安全、监管等多种职能。它作为整个系统的统一入口,通过对请求的识别、路由分发、请求转发等方式,协助后端实现服务的合理提供。 二、网关的优点 可以做一些…

    Java 2023年5月15日
    00
  • Java数组,去掉重复值、增加、删除数组元素的实现方法

    Java数组是一种非常常见的数据结构,可以存储一组相同数据类型的元素。下面我将详细讲解如何在Java中实现去掉重复值、增加、删除数组元素的方法。 Java数组去重 Java数组去重的实现通常有两种方法:使用HashSet或使用双循环。 使用HashSet String[] array = new String[]{"a", "b…

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