浅析JAVA中过滤器、监听器、拦截器的区别

下面开始详细讲解“浅析JAVA中过滤器、监听器、拦截器的区别”的完整攻略。

概述

Java Web开发中,过滤器、监听器、拦截器都是常用的三种组件,它们的作用都是在服务器接收请求和响应之间加入某种特性。虽然它们的功能有些相似,但它们的实现和应用场景又有所不同。

过滤器(Filter)

过滤器是在请求链中,对请求和响应进行预处理和后处理的组件。过滤器可以拦截匹配到的请求,然后在请求到达目标Servlet之前,对请求进行预处理,比如请求参数过滤、字符编码格式转换、身份认证等操作;同样也可以对Servlet返回的响应进行后置处理,比如对响应内容进行修整,修改响应头等操作。

过滤器组件部署在应用服务器中,被部署之后会映射到具体的URL上,当客户端在浏览器中发起该请求时,会触发对应的过滤器进行处理,然后才会到达目标servlet。

以下是一个过滤器实现对请求参数进行打印的示例:

public class ParamsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String paramValue = request.getParameter("param");
        System.out.println("The param is " + paramValue);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁
    }

}

该示例中,过滤器 ParamsFilter 实现了对请求参数 param 进行打印的功能,代码中init() 方法和 destroy() 方法用于初始化和清理资源。

监听器(Listener)

监听器是在Web容器中,针对某些事件进行事件监听,用于捕获监听对象的各种事件,比如请求、会话、上下文等,然后可以做出相应的响应动作。它可以用于应用的各种业务场景,比如对请求、会话、上下文等进行生命周期管理、统计分析监控信息等操作。

监听器的实现方式是基于观察者模式,监听器注册一个事件,然后会被Web容器在事件触发时自动调用,做出相应的响应动作。

以下是一个监听器实现对Session创建事件进行计数和统计的示例:

@WebListener
public class SessionCounter implements HttpSessionListener {

    private static AtomicInteger counter = new AtomicInteger(0);

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        counter.incrementAndGet();
        System.out.println("Session created. Total active sessions: " + counter.intValue());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        counter.decrementAndGet();
        System.out.println("Session destroyed. Total active sessions: " + counter.intValue());
    }

}

该示例中,监听器 SessionCounter 实现了对Session创建、销毁事件进行计数和统计的功能,其中 HttpSessionListener 接口是用于Session生命周期相关的事件监听的。

拦截器(Interceptor)

拦截器是在Spring框架中,用于对请求和响应进行拦截和处理的组件。拦截器在Spring框架中是作为AOP(Aspect-Oriented Programming)编程中的一个重要组成部分,用于实现业务逻辑和服务的解耦,提高代码的可读性和可维护性。

拦截器是在AOP切面中应用的,它可以在请求到达目标Controller之前或之后进行请求处理,在响应返回给客户端之前或之后进行响应处理。拦截器主要使用了反射、动态代理和Spring IoC等技术实现。

以下是一个拦截器实现对请求URL进行权限校验的示例:

public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String uri = request.getRequestURI();
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false;
        } else {
            User user = (User) session.getAttribute("user");
            if(user.hasPermission(uri)){
                return true;
            }else{
                response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
                return false;
            }
        }
    }

}

该示例中,拦截器 AuthInterceptor 实现了对请求URL进行权限校验的功能,其中 HandlerInterceptorAdapter 是用于Controller请求处理程序的事件拦截的,该类实现了 HandlerInterceptor 接口,拥有前置、后置、异常等事件处理方法。

总结

在Java Web开发中,过滤器、监听器、拦截器都是常用的三种组件,每种组件各自有自己的特点和应用场景。在实际开发中,我们需要根据具体的业务需求来综合考虑选择何种组件进行应用,以达到最优的效果。

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

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

相关文章

  • 浅谈在页面中获取到ModelAndView绑定的值方法

    获取ModelAndView中绑定的值是很常见的操作,在MVC框架中,ModelAndView作为控制器处理请求后返回给视图的结果,其包含有业务逻辑处理的结果、响应状态和视图(jsp、html等)等信息。下面是获取ModelAndView中绑定的值的几种方法: 方法一:使用EL表达式(${})获取 EL表达式是JavaEE提供的一种表达式语言,可以在JSP或…

    Java 2023年6月15日
    00
  • jsp form表单方法示例

    下面是“jsp form表单方法示例”的完整攻略。 简介 在JSP中,表单是非常常见的页面元素,通常用于用户信息收集、搜索和数据提交等操作。本文将讲解如何在JSP页面中使用form表单。 表单基础知识 在JSP中,使用form表单需要以下基础知识: 表单是用来收集用户输入数据的一种HTML元素,通常使用 标签来表示。 表单可以使用GET或POST方式来提交数…

    Java 2023年6月15日
    00
  • Java时间戳类Instant的使用详解

    Java时间戳类Instant的使用详解 简介 Java时间戳类Instant是从Java 8版本开始的新特性,用于表示时间戳,与Java中的Date类相似。它提供了可靠的方法来处理时间戳和与时区的转换,是在处理时间数据时不可或缺的类。 Instant的创建 要创建一个新的Instant对象,我们可以使用现有的运行时间来得到一个时间戳,也可以使用静态方法of…

    Java 2023年5月20日
    00
  • Java8中Stream的详细使用方法大全

    Java8中Stream的详细使用方法大全 本文将详细介绍Java8中Stream的使用方法,包括Stream的定义、Stream常用操作、中间操作和终止操作等。 一、Stream的定义 Stream是Java 8中的新特性,它是对数据集合进行流式操作的API。使用Stream可以让我们更方便地对集合进行操作,提高代码的可读性和代码的简洁性。 二、Strea…

    Java 2023年5月26日
    00
  • ShardingJdbc读写分离的BUG踩坑解决

    以下是“ShardingJdbc读写分离的BUG踩坑解决”的详细攻略: 背景 首先,我们需要了解ShardingJdbc是什么,它是一个基于JDBC驱动来实现分库分表和读写分离的中间件。而在使用ShardingJdbc的过程中,我们可能会遇到一些问题,比如说读写分离的BUG。 问题描述 在实践过程中,我们发现使用ShardingJdbc读写分离时,有时候会出…

    Java 2023年6月16日
    00
  • BeanUtils.copyProperties使用总结以及注意事项说明

    BeanUtils.copyProperties使用总结以及注意事项说明 Java中的BeanUtils.copyProperties方法可以将一个Java Bean的属性值拷贝到另外一个Java Bean中。此方法的使用非常方便,本文将对其使用进行总结,并介绍一些注意事项。 方法签名 下面是BeanUtils.copyProperties方法的签名: vo…

    Java 2023年5月20日
    00
  • 一文带你深入了解Java中延时任务的实现

    一文带你深入了解Java中延时任务的实现 延时任务(Delayed task)是一种可以在一定时间后触发的任务。在Java中,我们可以通过多种方式来实现延时任务,包括使用Timer/TimerTask类、ScheduledExecutorService类、和DelayQueue类等。 使用Timer/TimerTask类实现延时任务 Timer/TimerT…

    Java 2023年5月20日
    00
  • Jsp中如何让图片在div中居中

    让图片在 DIV 中居中可以使用 CSS 实现。下面是操作步骤和两个示例说明: 步骤 在 JSP 文件中,使用 <div> 标签定义包含图片的容器。 给此 div 标签设置宽度、高度、背景等样式,使其成为一个完整的盒子。 在 div 中嵌套 img 标签,定义图片的地址和大小。 在 CSS 样式文件中,使用 text-align: center;…

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