Servlet过滤器与SpringMVC拦截器

article/2025/10/15 4:58:25

   Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
   通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。如下所示:

  Servlet过滤器和SpringMVC的拦截器是有区别的,区别如下:

       ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

  注:在网页编程中action是<form>表单标签的属性,指代的是当用户提交这张表单的时候由哪张页面来进行处理,一般使用方式是:<form action=”处理页面路径”method=”post或get”>。表明表单提交后转到action指明的动作(其实就是java文件),在这个动作中可以得到表单的数据,并对这些数据进行操作。在这个动作中可以得到表单的数据,并对这些数据进行操作。

   一个Filter必须实现javax.servlet.Filter接口的三个方法:
   void setFilterConfig(FilterConfig config) //设置Filter的配置对象;
   FilterConfig getFilterConfig() //返回Filter的配置对象;
   void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) //执行Filter的工作

   Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下Filter的doFilter方法。

过滤器应用举例:

public class EncodingFilter implements Filter {    private String encoding = null;    public void destroy() {    encoding = null;    }    public void doFilter(ServletRequest request, ServletResponse response,    FilterChain chain) throws IOException, ServletException {    String encoding = getEncoding();    if (encoding == null){    encoding = ”gb2312”;    }    request.setCharacterEncoding(encoding);//在请求里设置指定的编码    chain.doFilter(request, response);  //通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源  }    public void init(FilterConfig FilterConfig) throws ServletException {    this.encoding = FilterConfig.getInitParameter(“encoding”);    }    private String getEncoding() {    return this.encoding;    }    }    

XML配置代码:

<Filter>    <Filter-name>EncodingFilter</Filter-name>    <Filter-class>com.logcd.Filter.EncodingFilter</Filter-class>    <init-param>    <param-name>encoding</param-name>    <param-value>gb2312</param-value>    </init-param>    
</Filter>    <Filter-mapping>    <Filter-name>EncodingFilter</Filter-name>    <url-pattern>/*</url-pattern>    
</Filter-mapping>    

  以上代码完成的功能为,无论进入哪个页面,都要先执行EncodingFilter类的doFilter方法设置字符集。其中,doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。参数 request, response 为web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 代表当前 Filter 链的对象。 对于FilterChain接口,代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,或者目标Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是 ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议

   和Servlet一样,Filter的创建和销毁也是由Web容器负责。

  Filter的主要的作用就是用户在访问某个目标资源之前,对访问的请求和响应进行拦截,做一些处理,然后再调用目标程序,这样做的好处是可以对一些公共的操作进行抽象,就拿设置字符集来说,如果不使用这种方式,我们每个页面都要写设置字符集的语句。不但麻烦而且维护困难,但是如果使用Filter的话,只需要添加一个类,在xml中配置一下,如果不想使用了,将配置文件中的内容去除即可。Filter基于回调函数,我们需要实现的Filter接口中doFilter方法就是回调函数。

  当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。

  请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

  过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。

  对于拦截器,写了点测试代码,顺便整理一下思路,搞清楚这几者之间的顺序:

  1、过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理

@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("before...");chain.doFilter(request, response);System.out.println("after...");}

  chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。

  2、拦截器是被包裹在过滤器之中的。

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}

   preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 System.out.println(“before…”)和chain.doFilter(request, response)之间执行的

  postHandle()方法在preHandle()方法之后,return ModelAndView之前执行,可以操控Controller的ModelAndView内容

  afterCompletion()方法是在过滤器返回给前端的前一步执行,也就是在chain.doFilter(request, response)和System.out.println(“after…”)之间执行

  3、SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatcher()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。

  

  总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且它是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

  Spring框架提供了一个已经实现了拦截器接口的抽象配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

 

 


http://chatgpt.dhexx.cn/article/Nhfogi7H.shtml

相关文章

JavaWeb Servlet过滤器概述

Servlet过滤器 1、什么是过滤器 Servlet过滤器具有拦截浏览器端请求的功能&#xff0c;Servlet过滤器可以改变请求中的内容来满足实际开发中的需求。 实质上Servlet过滤器就是在web应用服务器中的一个web应用组件&#xff0c;用于拦截浏览器与目标资源的请求&#xff0c;并对…

Servlet+过滤器

一、Servlet 1.1 概念 Servlet&#xff1a;Server Applet的简称&#xff0c;是服务器端的程序&#xff08;代码、功能实现&#xff09;&#xff0c;可交互式的处理客户端发送到服务端的请求&#xff0c;并完成操作响应。动态网页技术JavaWeb程序开发的基础&#xff0c;JavaEE…

java servlet过滤器简解及实例

在整个概念中&#xff0c;个人觉得有一篇文章写得不错&#xff0c;通俗易懂&#xff0c;这里就直接套用以上原博文&#xff0c; 一、概念&#xff1a; Filter也称之为过滤器&#xff0c;它是Servlet技术中比较激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;…

Servlet过滤器案例-自动登录

使用过滤器实现自动登录 登录的jsp页面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head> <title&g…

Servlet过滤器拦截器

文章目录 1、什么是Servlet&#xff1f;2、过滤器与拦截器的区别 1、什么是Servlet&#xff1f; 参考&#xff1a;https://blog.csdn.net/wozaibohaibian/article/details/124778494 ​ servlet就是一个组件,需要符合servlet规范,并且需要部署到servlet容器里面才能运行 注&…

servlet过滤器原理及使用

原理 首先了解什么是过滤器&#xff0c;各种文章已经写的很清楚了 引用来自这篇大牛的博客 是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进…

Servlet——过滤器

Servlet过滤器 什么是过滤器 过滤器是一个程序&#xff0c;它先于与之相关的Servlet页面运行在服务器上&#xff0c;但它并不是一个标准的Servlet&#xff0c;它不能处理用户请求&#xff0c;也不能对客户端生成响应。它主要用于对HttpServletRequest进行预处理&#xff0c;也…

servlet过滤器的简单使用

为什么要用过滤器或者拦截器&#xff1f; 简单来讲&#xff0c;当一个账户需要进入某个系统调用某个接口时&#xff0c;我们需要对其进行相应验证&#xff0c;否则一旦接口暴露&#xff0c;可能会造成系统崩溃。这个时候我们就需要用拦截器对调用接口一方进行身份验证。 serv…

Servlet过滤器Filter

Servlet Filter 又称 Servlet 过滤器&#xff0c;它是在 Servlet 2.3 规范中定义的&#xff0c;能够对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查和修改。Filter 不是 Servlet&#xff0c;不能直接访问&#xff0c;它本身也不能生成 request 对象和 r…

Servlet之过滤器

问题引入 以往的Servlet中&#xff0c;有冗余代码&#xff0c;多个servlet都要进行编写 概念 过滤器(Filter)是处于客户端于服务器资源之间的一道技术。 图示&#xff1a; 过滤器的作用 执行地位在Servlet之前&#xff0c;客户端发送请求时&#xff0c;会先经过Filter&#xff…

servlet过滤器的介绍

servlet过滤器是服务器与客户端请求与响应的中间层组件&#xff0c;它主要是用于对浏览器的请求进行过滤处理&#xff0c;并将过滤后的请求再转给下一个资源。 servlet过滤器的基本概念 Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求&#xff0c;而…

Servlet——过滤器(fiter)

什么是过滤器&#xff1f; 过滤器是Servlet的一个组件&#xff0c;是设计模式中过滤器模式&#xff08;又叫责任链模式&#xff09;的一种经典实现 是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff…

java基础篇---Servlet过滤器

Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求&#xff0c;而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件&#xff0c;在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理&#xff0c;将过滤后的请求再转给下一个资源…

mac下idea卡顿问题解决

一、背景 mac下idea卡顿 二、原因 赋予idea的内存太小了&#xff0c;需要给他更大的内存 三、解决方法 1、修改idea.vmoptions 配置文件。 help --Edit Custom VM Options 2、修改文件 这是我修改之前的&#xff1a; -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m…

macOS看视频卡顿如何修复

很多时候我们都会遇到这样一个问题&#xff1a;明明电脑很新&#xff0c;处理器内存什么的也都不差&#xff0c;但看在线视频就是卡&#xff0c;画面和音频对不上&#xff0c;令人很难受。其实这是Flash播放器开了P2P的原因。今天我就教教大家macOS看视频卡顿如何修复。 先打开…

MAC 外接键盘卡顿处理

系统偏好设置-> 键盘。 1&#xff1a;将『按键重复』调到快&#xff0c;将『重复前延迟』调到段&#xff0c;点击『更改键盘类型』,并且按照提示一步步让电脑识别键盘。 2 &#xff1a;切换『文本』&#xff0c;去勾『触控栏键入建议』&#xff0c;可以起到调优作用。

MAC如何解决idea卡顿问题

故事是这样的 我的mac配置也不是很高&#xff0c;内存大概是这样的 但是刚下载完idea后&#xff0c;简直比我之前2000块的windows本都卡。偶买噶&#xff0c;差点想直接退货。 好在控制住脾气&#xff0c;然后冷静思考后觉得&#xff0c;不该呀&#xff0c;好歹那么贵&#x…

matlab java mac_Matlab for mac卡顿、抛Java异常

在苹果上使用Matlab后&#xff0c;试用了几个版本后都十分卡顿&#xff0c;后来抛出了Java.lang.OutOfMemoryError. 后查阅资料认为可能是Matlab JVM内存不够的问题。官方给出的解决方案如下&#xff0c;将JVM内存设置到最大后&#xff0c;情况有所缓解。有时候仍然有些卡 但是…

解决 Macbook 连接蓝牙鼠标卡顿问题

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。会造成蓝牙鼠标卡顿具体解决办法如下&#xff1a; 打开“系统偏好设置”——“网络”&#xff0c;然后选择更多这里&#xff08;如图&#xff09…

优化不必要的动画,以减少Mac卡顿

本文通过两种方式来减少Mac的动画&#xff0c;友情提示&#xff1b;常重启有助于保持Mac系统正常运转。 条件允许的情况下&#xff0c;安装旧版本Mac系统、减少运行不必要的软件能优化Mac运行速度。 一、系统设置 打开系统偏好设置——>辅助功能 勾选 “减弱动态效果” …