首页 > 其他分享 >Servlet过滤器

Servlet过滤器

时间:2023-08-10 19:23:38浏览次数:36  
标签:web 请求 Filter 组件 过滤器 Servlet

过滤器的基本概念

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

  Filter是在Servlet 2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器完成。

  过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。

  

Filter

  Servlet过滤器Fileter是一个小型的web组件,它们通过拦截请求和响应,以便查看、提取或以某种方式操作客户端和服务器之间交换的数据,实现“过滤”的功能。Filter通常封装了一些功能的web组件,过滤器提供了一种面向对象的模块化机制,将任务封装到一个可插入的组件中, Filter组件通过配置文件来声明,并动态的代理。

简单来说Servlet的Filter是:

●  声明式的:通过在web.xml配置文件中声明,允许添加、删除过滤器,而无需改动任何应用程序代码或jsp页面。

●  灵活的:过滤器可用于客户端的直接调用执行预处理和后期的处理工作,通过过滤链可以实现一些灵活的功能。

●  可移植的:由于现今各个web容器都是以Servlet的规范进行设计的,因此Servlet过滤器同样是跨容器的。

●  可重用的:基于其可移植性和声明式的配置方式,Filter是可重用的。

总的来说,Servlet的过滤器是通过一个配置文件来灵活的声明的模块化可重用组件。过滤器动态的截获传入的请求和传出的响应,在不修改程序代码的情况下,透明的添加或删除他们。其独立于任何平台和web容器。

Filter体系结构

如其名字所暗示的一样,Servlet过滤器用于拦截传入的请求和传出的响应,并监视、修改处理web工程中的数据流。过滤器是一个可插入的自由组件。web资源可以不配置过滤器、也可以配置单个过滤器,也可以配置多个过滤器,形成一个过滤器链。Filter接受用户的请求,并决定将请求转发给链中的下一个组件,或者终止请求直接向客户端返回一个响应。如果请求被转发了,它将被传递给链中的下一个过滤器(以web.xml过滤器的配置顺序为标准)。这个请求在通过过滤链并被服务器处理之后,一个响应将以相反的顺序通过该链发送回去。这样,请求和响应都得到了处理。

Filter可以应用在客户端和Servlet之间、servlet和serlvet或jsp之间,以及jsp之间。并且可以通过配置信息,灵活的使用那个过滤器。

Filter工作原理

基于Filter体系结构的描述,我们可以看出Filter的工作原理,简单的通过一幅流程图加以演示:

 

客户端浏览器在访问web服务器的某个具体资源的时候,经过过滤器1中code1代码块的相关处理之后,将request请求传递给过滤链中的下一个过滤器2,(过滤链的顺序以配置文件中的顺序为基准)过滤器2处理完之后,request就传递的Servlet完成相应的逻辑。返回响应的过程类似,只是过滤链的顺序相反,这里就不多说了。

Filter的创建过程

要编写一个过滤器必须实现Filter接口。实现其接口规定的方法。

★  实现javax.servlet.Filter接口

★ 实现init方法,读取过滤器的初始化参数

★ 实现doFilter方法,完成对请求或响应的过滤

★ 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应

一个最基本的过滤器实现代码:

 java类:

复制代码
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class BasicsFilter implements Filter {

    public BasicsFilter() {
        // 容器(服务器)启动时执行
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        /* 容器(服务器)时执行 */
        System.out.println("======== 初始化方法 ========");
        // 获取的是web.xml中配置Filter时设置的值,参数为设置值得名称,若参数不存在,则返回空
        String initParam = fConfig.getInitParameter("param");
        System.out.println("param ========" + initParam);
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /* 在访问的时候执行 */
        System.out.println("======= 开始执行doFilter ========");
        // 转发到下一个组件,进行后续的处理(组件可以是一个过滤器,也可以是一个servlet)
        chain.doFilter(request, response);
        System.out.println("======= 结束执行doFilter ========");
        
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
}
复制代码

web.xml配置:

复制代码
<filter>
    <filter-name>basicsFilter</filter-name>
    <filter-class>com.hudongwu.filter.BasicsFilter</filter-class>
    <init-param><!-- 设置在过滤器中执行初始化方法时,获取的值 -->
        <param-name>param</param-name>
        <param-value>studyFilter</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>basicsFilter</filter-name>
    <!-- 设置为访问该网站所有地址都需要通过该过滤器 -->
    <url-pattern>/*</url-pattern>
    <!-- 设置为只有访问该网站的/Helloword地址时才通过该过滤器 -->
    <url-pattern>/Helloword</url-pattern>
</filter-mapping>
复制代码

标签:web,请求,Filter,组件,过滤器,Servlet
From: https://www.cnblogs.com/zhangsai/p/17621293.html

相关文章

  • django自定义过滤器
    https://docs.djangoproject.com/zh-hans/3.1/howto/custom-template-tags/代码布局自定义的tags和filters会保存在模块名为 templatetags 的目录内。模块文件的名字即稍候你用来加载tags的名字,所以小心不要采用一个可能与其它应用自定义的tags和filters冲突的名......
  • Servlet课程学习
    Servlet 最近暑假学习了servlet的技术,想一边学习一边记录下。先了解下servlet是什么?JavaServlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet,您可以收集来自网页......
  • 授权过滤器—MVC中使用授权过滤器实现JWT权限认证
    一、什么是过滤器?过滤器定义:​过滤器与中间件很相似,过滤器(Filters)可在管道(pipeline)特定阶段(particularstage)前或后执行操作,可以将过滤器视为拦截器(interceptors)。在.NETMVC开发中,权限验证是非常重要的一部分。通过使用授权过滤器可以很方便地实现权限验证功能。这篇主要分......
  • 布隆过滤器
    布隆过滤器1.作用判断某一个值是否存在2.组成很长的二进制数组和一系列hash函数3.使用使用hash函数对该值进行hash运算,并将布隆过滤器中相应的位置设置为14.判断某一个数据在布隆过滤器中是否存在对该值使用布隆过滤器的一系列hash函数进行hash运算,然后判断对应的位置......
  • 老杜 JavaWeb 讲解(十九) ——Filter过滤器
    (十七)Filter过滤器Filter过滤器当前的OA项目存在什么缺陷?DeptServlet、EmpServlet、OrderServlet。每一个Servlet都是处理自己相关的业务。在这些Servlet执行之前都是需要判断用户是否登录了。如果用户登录了,可以继续操作,如果没有登录,需要用户登录。这段判断用户是否登录......
  • JavaWeb之Servlet入门版教务系统(二)
    本次要分享的内容是之前教务系统中系统管理模块下的角色列表功能,包括对角色信息进行增删改查以及对当前的用户进行角色的分配(重点讲解)。首先还是需要使用mysql数据库准备一张角色表,建表语句如下:DROPTABLEIFEXISTS`sys_role`;CREATETABLE`sys_role`(`role_id`int(11)NO......
  • SpringBoot学习笔记--过滤器Filter
    一、普通过滤器Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数、属性进行调整。常常在过滤器中处理字符编码。1、创建自定义过滤器类packagecom.cqjtu.vo;importjavax.servlet.*;importjava.io.IOException;//自定义过滤器类publicclassMyFilterimplements......
  • springboot 关于servlet容器配置修改 组件注册 容器切换 使用外部tomcat
    1.嵌入式Servlet容器配置修改1.通过全局配置文件修改可以通过server.xxx来进行web服务配置,没有带服务器名称的则是通用配置通过带了具体的服务器名称则是单独对该服务器进行设置,比如server.tomcat.xxx就是专门针对tomcat的配置2.通过WebServerFactoryCus......
  • django开发的safe过滤器适用
    django_safe在自己开发的博客系统当中,如果使用django框架,那么在发布博客内容的时候,希望可以发布一些被渲染过的样式文本,比如说图片等。下面是发布文章用到的代码#views.pydefarticle_detail(request,username,article_id):user=UserInfo.objects.filter(username=use......
  • SpringBoot中Filter bean是怎么被添加到Servlet容器中的
    参考资料对于SpringBoot的IOC容器——ServletWebServerApplicationContext,其中的Filterbean,每个Filterbean都会被独立的注册成为Servlet的Filter。大概的注册过程分成2步:IOC容器——ServletWebServerApplicationContext将Filter接口的实现类封装成FilterRegistrationBean,放......