Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 过滤器和拦截器

Java 过滤器和拦截器

作者头像
赵哥窟
发布于 2022-06-26 01:11:38
发布于 2022-06-26 01:11:38
88400
代码可运行
举报
文章被收录于专栏:日常技术分享日常技术分享
运行总次数:0
代码可运行
过滤器

概念: 滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求; 在请求到达Servlet/JSP之前,过滤器截获请求;

作用:在客户端的请求访问后端资源之前,拦截这些请求(添加处理)。

Filter接口是过滤器类必须实现的接口,该接口中有三个方法:

init(FilterConfig filterConfig) 该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次,参数FilterConfig可以获得filter的初始化参数;

doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法,方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。

destroy() 该方法在容器销毁对象前被调用。

过滤器的简单使用,先写一个过滤器的类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mport lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName="myFilter",urlPatterns="/*")
@Slf4j
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig arg0) {
       log.info("初始化过滤器!");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        log.info("请求地址:"+request.getRequestURI());
        // 交给下一个过滤器或servlet处理
        filterChain.doFilter(servletRequest,servletResponse);

        //HttpServletResponse response = (HttpServletResponse) servletResponse;
        //response.sendRedirect("http://baidu.com");//重定向
    }

    @Override
    public void destroy() {
        log.info("销毁过滤器!");
    }
}

在Application里面引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ServletComponentScan
拦截器

编写一个简单的拦截器处理类,请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法。 preHandle() 这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。 postHandle() 只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。 afterCompletion() 只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
@Component
public class AuthorInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行前
     * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
     * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    /**
     * 目标方法执行后
     * 该方法在控制器处理请求方法调用之后、解析视图之前执行
     * 可以通过此方法对请求域中的模型和视图做进一步修改
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle执行{}", modelAndView);
    }
    /**
     * 页面渲染后
     * 该方法在视图渲染结束后执行
     * 可以通过此方法实现资源清理、记录日志信息等工作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion执行异常{}", ex);
    }
}

将自定义好的拦截器处理类进行注册,并通过addPathPatterns、excludePathPatterns等属性设置需要拦截或需要排除的 URL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.tansun.springcloud.project.b.web.interceptor.AuthorInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Resource
    private AuthorInterceptor authorInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自己的拦截器,并设置拦截的请求路径
        //addPathPatterns为拦截此请求路径的请求
        //excludePathPatterns为不拦截此路径的请求
        //addPathPatterns拦截的路径
        String[] addPathPatterns = {
                "/order/**"
        };
        //excludePathPatterns排除的路径
        String[] excludePathPatterns = {
                ""
        };
        registry.addInterceptor(authorInterceptor).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
    }
}
过滤器和拦截器的区别

1.实现原理不同 过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。这里重点说下过滤器!在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。

2.使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。

而拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中。

3 触发时机不同

image.png

过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
spring boot拦截器和过滤器_java拦截器的作用
b.过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
全栈程序员站长
2022/09/23
9300
Springboot 过滤器拦截器 输出 接口 耗时
用户7630333
2023/12/07
3990
Springboot 过滤器拦截器 输出 接口 耗时
【Spring学习】过滤器和拦截器
过滤器是实现对请求资源(jsp、servlet、html)的过滤功能,是一个运行在服务器的程序,优先于请求资源(jsp、servlet、html)之前执行。
pbinlog
2022/03/29
7900
【Spring学习】过滤器和拦截器
Spring学习笔记(8)--拦截器Interceptor和过滤器Filter的区别详解
过滤器和拦截器 底层实现方式大不相同:过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。
黄规速
2022/04/14
4.1K0
Spring学习笔记(8)--拦截器Interceptor和过滤器Filter的区别详解
浅谈 | 过滤器、监听器、拦截器和AOP
最近在进行系统的日志模块重构工作,在选择技术实现的时候在过滤器和拦截器之间飘忽不定,于是决定抽点时间将过滤器和拦截器进行深度分析,顺便把监听器和AOP等内容也复习一下。
啃饼思录
2023/03/18
1.8K0
浅谈 | 过滤器、监听器、拦截器和AOP
过滤器 和 拦截器 6个区别,别再傻傻分不清了
周末有个小伙伴加我微信,向我请教了一个问题:老哥,过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊? 听到题目我的第一感觉就是:简单!
程序员小富
2020/06/04
1.2K0
过滤器 和 拦截器 6个区别,别再傻傻分不清了
springmvc过滤器和拦截器的区别_拦截器和过滤器的区别面试
创建一个过滤器类继承java.servlet.filter接口,实现filter中的拦截方法。
全栈程序员站长
2022/09/23
4050
springmvc过滤器和拦截器的区别_拦截器和过滤器的区别面试
拦截器(Interceptor)与过滤器(Filter)
  拦截器是面向切面(AOP)编程中应用的一种统一处理方案,就是在你的Controller、Servie或者一个Method调用一个Method,或者在Method调用一个Method之后,统一的进行处理的方案,基于Java的反射机制。
BUG弄潮儿
2021/06/25
4.7K0
拦截器(Interceptor)与过滤器(Filter)
Spring Boot2(七):过滤器拦截器的使用
过滤器和拦截器两者都具有AOP的切面思想,关于aop切面,可以看上一篇文章。过滤器filter和拦截器interceptor都属于面向切面编程的具体实现。
鸟不拉屎
2019/07/06
3.3K0
spring boot拦截器和过滤器_过滤器的实现
1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
全栈程序员站长
2022/09/23
1.8K0
spring boot拦截器和过滤器_过滤器的实现
面试突击90:过滤器和拦截器有什么区别?
过滤器(Filter)和拦截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面编程)思想实现的,用来解决项目中某一类问题的两种“工具”,但二者有着明显的差距,接下来我们一起来看。
磊哥
2022/10/28
4K0
【二十二】springboot整合拦截器实战并对比过滤器
本章和上章相比,通过使用拦截器的方式去模拟处理token的校验,再之后通过两者的对比,比较一下两者的不同。下面开始拦截器的基础用法学习。
小z666
2024/06/21
3820
【二十二】springboot整合拦截器实战并对比过滤器
一文读懂拦截器与过滤器
过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来。
用户7353950
2022/06/23
8410
一文读懂拦截器与过滤器
过滤器与拦截器的N个区别,别傻傻分不清了
Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。但它们之间又有不少区别,很多朋友工作多年,可能还没有深刻的了解它们的具体使用以及它们之间的区别。本文带大家全面了解一下它们的使用、实现机制以及区别。
程序新视界
2020/12/28
1.1K0
过滤器与拦截器的N个区别,别傻傻分不清了
万字长文带你彻底学会拦截器与过滤器
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
一只胡说八道的猴子
2021/02/04
9070
万字长文带你彻底学会拦截器与过滤器
spring中过滤器和拦截器_springboot拦截器顺序
1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。 如下图:
全栈程序员站长
2022/09/23
7590
spring中过滤器和拦截器_springboot拦截器顺序
SpringBoot实现过滤器、拦截器与切片
Filter是J2E中来的,可以看做是Servlet的一种“加强版”,它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。
用户5224393
2020/02/26
1.1K0
springboot过滤器和拦截器的实现和区别
springmvc中有两种很普遍的AOP实现: 1.过滤器(Filter) 2.拦截器(Interceptor)
Java编程指南
2019/08/02
2.1K0
SSM项目中使用拦截器和过滤器
Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定 的功能,自定义的拦截器必须实现 HandlerInterceptor 接口
别团等shy哥发育
2023/02/25
7410
SSM项目中使用拦截器和过滤器
过滤器和拦截器的区别和执行顺序图_压缩空气过滤器安装顺序
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。——百度百科
全栈程序员站长
2022/09/23
7300
过滤器和拦截器的区别和执行顺序图_压缩空气过滤器安装顺序
推荐阅读
相关推荐
spring boot拦截器和过滤器_java拦截器的作用
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验