首页 > 其他分享 >过滤器和拦截器的区别

过滤器和拦截器的区别

时间:2023-08-23 23:13:44浏览次数:32  
标签:拦截器 请求 区别 可以 响应 调用 过滤器

一、过滤器

1.什么是过滤器?

  过滤器是一种用于JavaWeb应用程序中的组件,它可以拦截HTTP请求和响应,以实现一些特定的功能。

  过滤器可以对请求和响应进行修改,可以阻止请求进入Servlet,也可以修改响应返回给客户端。

2.过滤器的主要作用

  • 登录验证:检查用户是否已经登录,如果没有登录则跳转到登录页面。
  • 权限控制:检查用户是否有访问某个资源的权限,如果没有则提示错误信息或者跳转到其他页面。
  • 编码转换:设置请求和响应的字符编码,解决中文乱码问题。
  • 敏感词过滤:替换或者屏蔽掉请求参数或者响应内容中的敏感词汇。
  • 日志记录:记录用户的访问信息,如IP地址,访问时间,访问路径等。

3.过滤器的底层实现原理是基于回调函数的

  当一个请求到达服务器时,服务器会根据请求的URL匹配相应的过滤器链。过滤器链是由一个或多个过滤器组成的,按照配置的顺序依次执行。

  每个过滤器都实现了Filter接口,该接口定义了三个方法:

  • init(FilterConfig filterConfig):初始化方法,在过滤器创建时调用一次,可以用来获取过滤器配置参数。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain):过滤方法,在每次请求被拦截时调用,可以用来执行具体的过滤逻辑。该方法有三个参数:request表示请求对象,response表示响应对象,chain表示过滤器链对象。通过调用chain.doFilter(request, response)方法,可以将请求传递给下一个过滤器或者目标Servlet。如果不调用该方法,则请求被阻止,不会继续处理。
  • destroy():销毁方法,在过滤器被销毁时调用一次,可以用来释放资源。

  使用过滤器有两种方式:

    注解方式和XML方式。

    注解方式是通过在过滤器类上添加@WebFilter注解来配置过滤器的属性,如拦截路径,初始化参数等。

    XML方式是通过在web.xml文件中添加<filter>和<filter-mapping>标签来配置过滤器的属性。

‘    两种方式都可以实现相同的功能,但是注解方式更简洁方便。

4.过滤器的使用场景

  • 防止SQL注入攻击:通过对请求参数进行检查和转义,避免恶意用户输入SQL语句造成数据库被篡改或泄露。
  • 防止跨站脚本攻击(XSS):通过对请求参数和响应内容进行编码或过滤,避免恶意用户输入HTML或JavaScript代码造成网页被篡改或用户信息被窃取。
  • 防止跨站请求伪造(CSRF):通过在表单中添加隐藏字段或者在请求头中添加自定义字段,并在服务器端进行验证,避免恶意用户利用用户已登录的身份发送非法请求。
  • 实现缓存机制:通过在响应头中添加缓存相关的字段,并在服务器端判断请求是否命中缓存,可以提高网站性能和用户体验。
  • 实现压缩机制:通过在响应头中添加压缩相关的字段,并在服务器端对响应内容进行压缩,可以减少网络传输的数据量和时间。

二、拦截器

1.什么是拦截器?

  拦截器是一种用于JavaWeb应用程序中的组件,它可以在Servlet执行之前拦截HTTP请求,并对请求进行一些处理,比如登录验证,权限控制,日志记录,编码转换等。

  拦截器可以根据需要决定是否继续执行Servlet或者返回响应。

2.拦截器的底层实现原理是基于动态代理的

  当一个请求到达服务器时,服务器会根据请求的URL匹配相应的拦截器链。拦截器链是由一个或多个拦截器组成的,按照配置的顺序依次执行。

  每个拦截器都实现了HandlerInterceptor接口,该接口定义了三个方法:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在Servlet执行之前调用,可以对请求进行预处理,也可以返回false来阻止请求继续执行。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在Servlet执行之后调用,可以对响应进行后处理,也可以修改ModelAndView对象。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整个请求完成之后调用,可以用来释放资源或者处理异常。

  使用拦截器有两种方式:

  注解方式和XML方式。

  注解方式是通过在拦截器类上添加@WebMvcConfigurer注解来配置拦截器的属性,如拦截路径,排除路径等。

  XML方式是通过在web.xml文件中添加mvc:interceptors标签来配置拦截器的属性。两种方式都可以实现相同的功能,但是注解方式更简洁方便。

3.拦截器的使用场景

  • 登录验证:检查用户是否已经登录,如果没有登录则跳转到登录页面或者返回错误信息。
  • 权限控制:检查用户是否有访问某个资源的权限,如果没有则提示错误信息或者跳转到其他页面。
  • 日志记录:记录用户的访问信息,如IP地址,访问时间,访问路径等。
  • 编码转换:设置请求和响应的字符编码,解决中文乱码问题。
  • 性能监控:记录请求的开始时间和结束时间,计算请求的处理时间和响应时间。

三、拦截器和过滤器的主要区别

  • 拦截器是基于动态代理的,它可以在目标方法执行前后或者异常时进行增强处理。过滤器是基于函数回调的,它只能在请求进入或者离开容器时进行过滤操作。
  • 拦截器是SpringMVC框架提供的,它只对控制器方法有效,而过滤器是Servlet规范定义的,它对所有的请求都有效,包括静态资源。
  • 拦截器可以访问控制器方法的上下文信息,如方法参数,返回值,异常等。过滤器只能访问请求和响应对象,不能获取具体的业务逻辑信息。
  • 拦截器可以通过返回值来控制请求是否继续执行,如果返回false,则请求被阻止。过滤器没有这样的功能,只能通过转发或者重定向来改变请求的流程。
  • 拦截器可以实现多个拦截器链式调用,而且调用顺序是可控的。过滤器也可以有多个过滤器依次执行,但是调用顺序是由容器决定的。

标签:拦截器,请求,区别,可以,响应,调用,过滤器
From: https://www.cnblogs.com/FangwayLee/p/17652998.html

相关文章

  • Java的深拷贝与浅拷贝的区别
    1、二者的区别浅拷贝:在拷贝一个对象时,对对象的基本数据类型的成员变量进行拷贝,但对引用类型的成员变量只进行引用的传递,并没有创建一个新的对象,当对引用类型的内容修改会影响被拷贝的对象。深拷贝:在拷贝一个对象时,除了对基本数据类型的成员变量进行拷贝,对引用类型的成员变量进行......
  • Vue和JSP的区别
    JSP简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页JSP 全名为 Java Server Pages,中文名叫 java 服务器页面,其根本是一个简化的 Servlet 设计,它是由Sun Microsystems 公司 倡导、许多公司参与一起建立的一种动态网页技术标准。JSP 技术是在传......
  • platform_device_register和platform_device_register_full的区别
    platform_device_register和platform_device_register_full都是用于在Linux内核中注册平台设备的函数,但是它们之间存在一些区别。platform_device_registerplatform_device_register函数用于注册一个平台设备。它接受一个指向platform_device结构体的指针作为参数,该结构体表示......
  • java中创建线程的三种方法以及区别
    java中创建线程的三种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程下面让我们分别来看看这三种创建线程的......
  • ArrayList和Vector及LinkedList的区别
    1.ArrayList和Vector的区别第一句话:ArrayList和Vector底层都是数组实现的,初始容量都为10;在ArrayList的底层,是通过定义一个DEFAULT_CAPACITY的常量来指定的,而Vector的底层,是直接在空参构造中,通过写死了一个this(10)来指定的;第二句话:Vector大部分方法的底层实现,都加了synchronized......
  • 跨境盒子:揭秘跨境电商与传统电商的区别,挑战与机遇并存!
    传统电商横行多年,而近年来,跨境电商逐渐崭露头角,成为电商行业的新宠。那么,跨境电商与传统电商之间究竟有哪些差异呢?本文将为你一一揭晓。1.市场范围:跨境电商瞄准全球市场,传统电商则以国内市场为主要目标。跨境电商通过跨越国界的方式,将商品销售到全球各个国家和地区,而传统电商则主......
  • Dockerfile和Docker_Compose的区别
    最近在学习docker相关的知识,接触到Dockerfile和Docker_Compose,那么这2个东西有啥区别呢,特此记录一下。一、什么是dockerfile?1、Dockerfile是一个包含用于组合映像的命令的文本文档 2、dockerbuild命令用于从Dockerfile构建映像 3、可以在dockerbuild命令中使用-f标志指向文......
  • 直播平台软件开发,vue-全局过滤器时间
    直播平台软件开发,vue-全局过滤器时间步骤一:处理数据 exportconstformatYmd=(date)=>{ lettime=newDate(date)  lety=time.getFullYear() letm=time.getMonth()+1 letd=time.getDate()  return[y,m,d].map((v)=>String(v).padStart(2,'0......
  • 全链路压测与普通压测的区别
    一、前言什么是全链路压测?全链路压测和平时做的普通压测有什么区别?全链路压测能为业务解决什么问题?如果你对全链路压测存在这些疑问,不妨通过本文一探究竟。二、什么是全链路压测?压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患......
  • 依赖注入 和 new 一个实例有什么区别吗
    Java这东西就是纯粹的概念,而且很多公司还喜欢拿着这个不停的问。我们平常写的Class就是对象。New就是把这个Class实例化,实例化啥意思,就是在内存中分配空间呗,不实例化,数据存哪里呀。这里就是有个奇葩的问题,因为ClassA中有个变量叫做ClassB,那这个就叫做依赖了。如果......