java中过滤器,拦截器,监听器的区别 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/14 09:42:09 2023/08/14
【摘要】 在Java中,过滤器(Filter),拦截器(Interceptor)和监听器(Listener)都是用于实现特定功能的组件,但它们在功能和使用方式上有一些区别。过滤器(Filter): 过滤器是Servlet规范中定义的一种组件,用于在请求到达目标资源之前或响应返回给客户端之前对请求和响应进行预处理和后处理。过滤器可以对HTTP请求和响应进行修改、转换和验证,常见的应用场景包括编码转换、请...

在Java中,过滤器(Filter),拦截器(Interceptor)和监听器(Listener)都是用于实现特定功能的组件,但它们在功能和使用方式上有一些区别。

  1. 过滤器(Filter): 过滤器是Servlet规范中定义的一种组件,用于在请求到达目标资源之前或响应返回给客户端之前对请求和响应进行预处理和后处理。过滤器可以对HTTP请求和响应进行修改、转换和验证,常见的应用场景包括编码转换、请求参数过滤、权限验证等。过滤器可以通过配置在web.xml文件中,也可以使用注解方式进行配置。
  2. 拦截器(Interceptor): 拦截器是在Java开发框架中常见的一种组件,可以在方法调用前后或异常抛出时执行一些额外的逻辑。拦截器通常用于在处理请求之前和之后进行一些公共的操作,如日志记录、性能监控、权限验证等。拦截器可以通过配置在配置文件中,也可以使用注解方式进行配置。在Java开发框架中,如Spring MVC、Struts2等都提供了拦截器的支持。
  3. 监听器(Listener): 监听器是JavaEE规范中定义的一种组件,用于监听和响应容器(如Servlet容器或应用服务器)中发生的事件。监听器可以监听和响应各种事件,如容器的启动和关闭、会话的创建和销毁、属性的变化等。监听器可以通过配置在web.xml文件中,也可以使用注解方式进行配置。 总结:
  • 过滤器主要用于对HTTP请求和响应进行预处理和后处理。
  • 拦截器主要用于在方法调用前后或异常抛出时执行额外的逻辑。
  • 监听器主要用于监听和响应容器中发生的事件。
  • 过滤器和拦截器可以通过配置或注解进行配置,而监听器通常通过配置文件进行配置。
  • 过滤器和拦截器是在应用程序中显式调用的,而监听器是由容器自动调用的。

下面是过滤器、拦截器和监听器的代码示例:

  1. 过滤器(Filter)示例:
javaCopy codeimport javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化方法
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 在请求到达目标资源之前的处理逻辑
        // 可以对请求进行修改、转换或验证
        chain.doFilter(request, response);
        // 在响应返回客户端之前的处理逻辑
        // 可以对响应进行修改、转换或验证
    }
    @Override
    public void destroy() {
        // 过滤器销毁方法
    }
}
  1. 拦截器(Interceptor)示例(以Spring MVC为例):
javaCopy codeimport org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在方法调用前执行的逻辑
        return true; // 返回true表示继续执行后续的拦截器和处理器方法,返回false表示终止请求处理
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 在方法调用后、视图渲染前执行的逻辑
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        // 在视图渲染后执行的逻辑,可以用于资源清理等操作
    }
}
  1. 监听器(Listener)示例(以ServletContextListener为例):
javaCopy codeimport javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 容器初始化时执行的逻辑
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 容器销毁时执行的逻辑
    }
}

以上代码示例仅为演示过滤器、拦截器和监听器的基本使用方式,实际使用时可能需要根据具体需求进行适当的修改和扩展。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。