聊聊java 过滤器、监听器、拦截器的区别(终结篇)

下面是详细讲解“聊聊java 过滤器、监听器、拦截器的区别(终结篇)”的完整攻略。

什么是过滤器、监听器和拦截器?

在 Java Web 开发中,过滤器(Filter)、监听器(Listener)、拦截器(Interceptor)都是用来对 HTTP 请求进行处理和过滤的技术手段。

过滤器(Filter)

过滤器(Filter)是在 Servlet 中用来对请求和响应进行预处理和后处理的简单对象,用于统一修改请求/响应属性或处理请求/响应。Filter 通常用于对请求进行过滤处理,比如编码转换、HTTP 认证等。

监听器(Listener)

监听器(Listener)是在 Servlet 中用来监听 Web 应用程序中某些对象和事件状态的接口,以触发相应的事件处理器对其作出响应。比如,我们可以监听会话的创建和销毁事件,对用户的会话进行管理。

拦截器(Interceptor)

拦截器(Interceptor)是 Spring Framework 提供的,是一种更强大的对请求的拦截和修改的机制,也用于统一地修改请求/响应属性或处理请求/响应,但比 Filter 更加强大。拦截器具有链式的特点,可以自由控制拦截顺序,也可以中断后面的拦截器或处理器。拦截器可以用于各种场景,比如拦截非法请求、记录请求日志、性能监控等。

过滤器、监听器、拦截器的区别

处理范围不同

过滤器是处理请求和响应,监听器是监听对象、资源、事件等的变化,拦截器是在控制器(Controller)前后进行拦截,处理请求和响应。

触发时机不同

过滤器是在请求被 Servlet 前处理,响应处理结束后才被调用,如下图:

         ----------       ----------       ----------
Request |  Filter1 |---->|  Filter2 |---->|  Filter3 |---->| Servlet |
         ----------       ----------       ----------

         ----------       ----------       ----------
Response|  Filter3 |<----|  Filter2 |<----|  Filter1 |<----| Servlet |
         ----------       ----------       ----------

监听器是在对象的生命周期中监听对象的某些状态,如下图:

              ------------------ 
Web Container |  Object  | Event |
              ------------------   
                  |   /\   | ^    
                  |   |    | |    
                  |   |    | |    
                  v   |    | |    
              ------------------- 
Application   |   Listener          |
              ------------------- 

拦截器是在请求到达控制器之前或者响应返回浏览器之前进行拦截或者修改,如下图:

                  ------------ 
     Inbound --->|Interceptors|---+     
                  ------------    | 
                        |         |Before the
                        |         |Controller
                        v         | 
                  ------------ 
              --->| Controller |
                  ------------  
                        |         |
                        v         |After the
                  ------------    |Controller
                 |Interceptors|
                  -------------
                        |         |
                        v           Outbound
                 ------------
              <---|Interceptors|<---
                 ------------    

配置方式不同

Filter 配置在 web.xml 中:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Listener 配置在 web.xml 中:

<listener>
    <listener-class>com.example.MyListener</listener-class>
</listener>

Interceptor 配置在 Spring 的配置文件中:

<mvc:interceptors>
    <bean class="com.example.MyInterceptor"/>
</mvc:interceptors>

示例说明

示例 1:使用过滤器统一处理编码问题

在很多 Web 应用中,中文字符集的编码很容易出现问题,如果没能正确处理会出现乱码问题,这时可以使用过滤器来统一处理编码问题,比如下面的代码:

public class EncodingFilter implements Filter {

    private String encoding;

    public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset=" + encoding);
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

在 web.xml 中配置过滤器:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.example.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这样,在所有的请求中,请求参数的编码方式都会被统一设置成 UTF-8。

示例 2:使用拦截器记录请求日志

在许多场景中,需要记录请求日志,比如,记录请求的 URL、请求方法、请求参数、请求时间等,这时候我们可以使用拦截器来实现,比如下面的代码:

public class LogInterceptor implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("请求: {}, 方法: {}", request.getRequestURL(), request.getMethod());
        logger.info("IP地址: {}", request.getRemoteAddr());
        logger.info("请求参数: {}", JSONObject.toJSONString(request.getParameterMap()));
        logger.info("请求时间: {}", LocalDateTime.now());
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

在 Spring 的配置文件中配置拦截器:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.example.LogInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

这样,在所有的请求前,都会先记录请求日志,并打印到日志文件中。

以上就是关于“聊聊java 过滤器、监听器、拦截器的区别(终结篇)”的全部内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊java 过滤器、监听器、拦截器的区别(终结篇) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • JavaSE递归求解汉诺塔问题的思路与方法

    关于JavaSE递归求解汉诺塔问题的思路与方法,应该是这样的: 必要前提 在讲解算法大家之前,我们需要先了解一下汉诺塔问题的规则。汉诺塔问题是一个经典的算法问题,它来源于印度的传说。大概形式就是:有三个柱子,分别记为A、B、C,A柱子上有n个大小不相同的盘子,盘子大小依次从小到大排列。现在要把A柱子上的n个盘子移到C柱子上,但是规定每次只能移动一个盘子,且大…

    other 2023年6月27日
    00
  • vs 专业版 旗舰版 Express 区别

    VS 专业版、旗舰版和 Express 版的区别攻略 Visual Studio(VS)是一款功能强大的集成开发环境(IDE),提供了多个版本以满足不同开发需求。在下面的攻略中,我将详细讲解 VS 专业版、旗舰版和 Express 版之间的区别。 1. VS 专业版(Professional) VS 专业版是面向专业开发人员的版本,提供了广泛的功能和工具,以…

    other 2023年7月27日
    00
  • PowerShell批量文件重命名操作实例

    下面我将为你详细讲解“PowerShell批量文件重命名操作实例”的完整攻略。 1. 前言 在实际工作中,我们经常需要对大量的文件进行重命名处理。如果手动一个个重命名,工作量难以承受。此时,使用PowerShell批量文件重命名操作可以极大地提高工作效率。 2. 实现过程 2.1 基础命令 PowerShell中的重命名操作使用Rename-Item命令。使…

    other 2023年6月26日
    00
  • thinkphp5 模型实例化获得数据对象的教程

    下面是详细的攻略: ThinkPHP5模型实例化获得数据对象的教程 什么是模型 在ThinkPHP5中,模型是用来封装对于某个数据表的所有操作的类,通过模型来完成对数据表的查询、添加、修改、删除等操作。每个模型都对应数据库中的一个数据表。 实例化模型 在使用模型之前,需要先实例化模型。在ThinkPHP5中,实例化模型可以使用以下方式: $model = m…

    other 2023年6月27日
    00
  • iphone内存如何清理 苹果手机内存不足的解决方法

    iPhone内存清理攻略 苹果手机内存不足时,可以采取以下方法来清理内存并解决问题。本攻略将详细介绍这些方法,并提供两个示例说明。 方法一:关闭不必要的后台应用程序 在iPhone上双击Home按钮或者在iPhone X及更高版本上从底部向上滑动,打开多任务管理器。 在多任务管理器中,向左或向右滑动以查看所有后台应用程序。 找到不必要的应用程序,并向上滑动关…

    other 2023年8月1日
    00
  • NTRights 命令行(DOS)修改用户权限功能详细说明

    为了修改用户的权限,我们可以使用NTRights命令行工具。该工具可以在DOS命令窗口中使用,支持修改用户的权限。接下来是NTRights命令行修改用户权限的详细攻略: 1. 下载NTRights命令行工具 要使用NTRights工具,您需要首先下载它。NTRights是Microsoft Windows Resource Kit Tools中的一部分,您可…

    other 2023年6月26日
    00
  • iconmoon

    以下是关于IconMoon的完整攻略: IconMoon简介 IconMoon是一个用于创建和管理自定义图标的工具,它提供了一个易于使用的界面和多种导出选项。IconMoon支持多种图标格式,包括SVG、PNG、字体等。 使用IconMoon 以下是使用IconMoon的步骤: 访问IconMoon网站:https://icomoon.io/ 点击“Impo…

    other 2023年5月6日
    00
  • h.264和hevc分析软件和工具【转】

    H.264和HEVC分析软件和工具【转】 在视频编码技术中,H.264是十分常用的视频压缩标准之一,而HEVC则是继H.264之后的新一代视频压缩标准。这篇文章将为大家介绍一些用于H.264和HEVC视频分析的软件和工具。 1. FFmpeg FFmpeg是一个开源的、跨平台的视频和音频编解码库,它在很多视频处理软件中都得到了广泛的应用。对于H.264和HE…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部