关于拦截器和过滤器你真的了解吗???

1.拦截器和过滤器介绍

我们在登陆的时候,不加拦截器的话,首页不需要登陆也可以访问,为了解决不登陆也能访问的问题,就需要拦截器和过滤器

2.拦截器和过滤器的区别

2.1过滤器

①Filter说明

配置简单,只需要实现Filter接口即可,通过@WebFilter注解进行请求拦截,Filter内部定义了三个方法,分别是init(),doFilter(),destroy()

init():容器的初始化,只会被调用一次,在容器初始化的时候被调用

doFilter():在容器的每一次调用的时候,都会被调用,FilterChain用来做请求拦截和放行

destory():只会被调用一次,在容器销毁的时候会被调用

②WebFilter注解使用说明

@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )

③注意点

使用SpringBoot注册拦截器的时候,不要忘记在启动类上加上注解@ServletComponentScan,否则拦截器不生效,如果要指定启动顺序,加上@Order(1) // filter顺序 越小越在前注解

2.2拦截器

拦截器是一种链式调用,在一个应用中可以存在多个拦截器,一个请求也是可以触发多个拦截器,咩个拦截器的调用顺序我们可以自己指定,实现方式上也是比较简单的,首先自己定义一个拦截器实现HandInterceptor接口,然后在自己定义的类中实现WebMvcConfigurer中进行注册

2.3 区别

过滤器和拦截器均体现了AOP的编程思想,实现方式上也存在不同,主要从实现原理,使用范围,触发时机,请求范围几个方面来讲解

①实现原理:
过滤器主要通过实现特定的接口(如 Java 中的 Filter)来实现功能,它针对的是特定的技术框架。而拦截器则通常是通过代理机制(如 Java 中的 AOP 代理)实现,可以应用于多种技术框架。
②使用范围:
过滤器通常用于处理 HTTP 请求,例如在 Web 应用中对请求进行预处理或后处理。而拦截器则可以应用于多个层次,既可以处理 HTTP 请求,也可以处理方法调用、对象创建等。
③触发时机:
过滤器一般在请求处理之前或之后触发,具体时机取决于过滤器的配置。而拦截器则可以在方法执行前、方法执行后、抛出异常时等多个时机触发。
④请求范围:
过滤器通常作用于一个请求,即处理完一个 HTTP 请求后才会继续处理下一个请求。而拦截器则可以作用于一个具体的方法调用,同一个拦截器可以被多次触发。

3.拦截器的实现

@WebFilter(filterName = "MyFilter",urlPatterns = "/*")
@Slf4j
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter初始化。。。。。");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter拦截器开始执行前");
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("MyFilter拦截器开始执行后");
    }
}

注意:不要忘记在启动累上加上@ServletComponentScan注解,否则拦截器不生效

4.过滤器的实现

①定义MyInterceptor实现HandlerInterceptor接口

@Component
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("MyInterceptor拦截生效");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

②在WebMvcConfigurer中进行注册

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                //拦截的地址
                .addPathPatterns("/**")
                //放行的地址
                .excludePathPatterns("/hello");
    }
}

5.拦截器和过滤器的使用场景

5.1 拦截器 (Interceptor)

拦截器主要应用于 Java Web 框架中,如 Spring MVC、Struts 等。拦截器可以拦截请求和响应,实现对请求的处理、对响应的修改等。拦截器的使用场景包括:
权限控制:在请求处理之前,检查用户是否具有访问特定资源的权限。
性能监控:记录请求的执行时间、系统负载等信息,以便于性能分析和调优。
功能增强:在请求处理之前或之后,添加特定的功能,如日志记录、参数校验等。
日志记录:记录请求的详细信息,包括请求方法、URL、参数等。

5.2 过滤器 (Filter)

过滤器是 Java Web 中的一种通用技术,可以应用于多种 Web 服务器和框架中。过滤器主要处理请求和响应,实现对请求内容的过滤、对响应内容的修改等。过滤器的使用场景包括:
输入验证:过滤器可以对请求的参数进行验证,确保请求内容的合法性。
输出过滤:过滤器可以对响应内容进行过滤,如去除敏感信息、添加响应头等。
文件上传过滤:在文件上传时,过滤器可以检查文件类型、大小等,防止恶意文件上传。
缓存控制:过滤器可以根据请求的 URL、参数等信息,判断请求是否需要从缓存中获取数据。

6.总结

拦截器主要应用于 Web 框架中,使用反射机制实现,可以访问请求和响应对象的属性和方法;过滤器则主要应用于 Java Web 服务器中,使用回调函数实现,只能访问请求和响应对象的输入流和输出流。拦截器和过滤器的使用场景有所不同,需要根据具体需求选择合适的技术。

7.源代码码云地址

拦截器和过滤器代码地址

更多内容请查看码云仓库

image-20230928102756448

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FastAPI中,可以使用拦截器(middleware)和过滤器(dependency)来处理请求和响应。它们都可以在请求到达路由处理函数之前或之后执行一些操作,但它们的作用和使用方法不太一样。 拦截器是在请求到达路由处理函数之前或之后执行的一系列操作,它们可以用于记录请求日志、身份验证、异常处理等操作。使用FastAPI的拦截器可以很方便地实现这些操作,例如: ```python from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async def log_requests(request: Request, call_next): """ 记录请求日志的拦截器 """ print(f"Received request: {request.method} {request.url}") response = await call_next(request) print(f"Sent response: {response.status_code}") return response ``` 在这个例子中,我们定义了一个记录请求日志的拦截器,它会在每次请求到达路由处理函数之前打印请求信息,并在响应返回后打印响应信息。这个拦截器使用了FastAPI的`middleware`装饰器,它指定了拦截器的类型为`http`,表示它要处理HTTP请求。 过滤器是在请求到达路由处理函数之前执行的一系列操作,它们可以用于身份验证、请求参数校验等操作。使用FastAPI的过滤器可以很方便地实现这些操作,例如: ```python from fastapi import FastAPI, Depends app = FastAPI() async def check_token(token: str): """ 检查token的依赖性 """ if token != "secret_token": raise HTTPException(status_code=401, detail="Invalid token") @app.get("/") async def read_root(token: str = Depends(check_token)): """ 需要token验证的路由处理函数 """ return {"Hello": "World"} ``` 在这个例子中,我们定义了一个需要token验证的路由处理函数,并使用了`Depends`装饰器来指定依赖性。这个依赖性函数`check_token`会在请求到达路由处理函数之前执行,它会检查请求中的token参数是否正确。如果token不正确,则会抛出一个HTTP异常,返回401错误码。 希望这些信息能够帮助您了解FastAPI中的拦截器过滤器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值