我的编程空间,编程开发者的网络收藏夹
学习永远不晚

filter过滤器怎么在Java项目中使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

filter过滤器怎么在Java项目中使用

这篇文章将为大家详细讲解有关filter过滤器怎么在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出。

要想使用Filter过滤器,非常简单,只要实现Servlet  API中的Filter接口即可,同时在该web应用【WEB-INF】目录下的web.xml文件中配置<filter>和<filter-mapping>两个标签。其中可以根据配置指定过滤的页面或者Servlet。

也就是说我们在web工程中光光写Filter过滤器的Java代码是不会起作用的,要在web.xml文件中对过滤器进行注册和映射,在学习Filter之前我们先来学习如何注册和映射
关于注册:

需要在web.xml文件中配置<filter>标签,这还不够,<filter>标签下的<filter-name>与<filter-class>是必须要填的内容。

<filter>标签中有如下子元素:

  1. <description>用于描述该标签,非必须;

  2. <filter-name>为过滤器指定一个名称,必须的

  3. <filter-class>指定该过滤器使用的web工程中的哪一个filter类,包含包名与类名,必须的;

  4. <init-param>为过滤器的初始化提供参数,非必须,后面有例子。

关于映射:

需要在web.xml文件中配置<filter-mapping>标签,这还不够,<filter-mapping>标签下的<filter-name>以及<url-pattern>或<servlet-name>之一是必须的。

<filter-mapping>标签中有如下子元素:

  1. <filter-name>设置要映射过滤器的名称,该名称必须同<filter>标签下的<filter-name>的值一致。

  2. <url-pattern>设置过滤器要拦截过滤的请求路径,例如“/*”则表示对该web应用下所有的请求都进行拦截过滤。

  3. <servlet-name>如果只要拦截过滤访问某个Servlet,就可以使用该标签来替代<url-pattern>。

  4. <dispatcher>设置拦截过滤客户端请求的方式,有REQUEST,INCLUDE,FORWARD,ERROR四种(请注意均为大写)。非必须则默认为REQUEST,使用多个<dispatcher>标签来设置多种请求方式。

关于<dispathcer>的四种方式,这里再简单的介绍一下:

  1. REQUEST:当用户直接访问我们的资源时,这时我们设置的过滤器就会进行拦截。但如果以转发和包含方式访问资源,那么该过滤器则不会被调用。

  2. INCLUDE:当使用RequestDispatch的include方法请求时,该过滤器会被调用。

  3. FORWARD:当使用RequestDispatch的forward方法时请求资源时,该过滤器会被调用,尤其是在MVC设计模式下,JSP都被保护起来,必须要通过Servlet进行转发才能访问JSP,那么该过滤器就是在Servlet转发到JSP这个过程中被执行。

  4. ERROR:当请求是通过错误异常进行跳转时就会调用该过滤器。

一个简单的对过滤器的注册和映射的示例:

<filter>  <filter-name>FilterDemo1</filter-name>  <filter-class>com.bjpowernode.web.filter.FilterDemo1</filter-class> </filter>   <filter-mapping>  <filter-name>FilterDemo1</filter-name>  <url-pattern>/*</url-pattern>  <dispatcher>REQUEST</dispatcher>  <dispatcher>FORWARD</dispatcher></filter-mapping>

在Servlet API 中关于Filter举例了使用过滤器能用来做些什么:

filter过滤器怎么在Java项目中使用

这里我也说明下平时Filter能在哪些方面会被经常用到:

① Filter可以作用在请求资源执行之前,进行权限检查,检查用户是否有权限,如有权限则放行请求;如果没有,则拒绝访问。

② Filter可以作用在请求资源执行之前,对Request和Response对象进行预处理操作,从而实现一些web应用的全局性设置,比如解决中文乱码问题。

③ Filter可以作用在最终响应输出之前,对输出Response对象中的数据进行处理,例如将输出的数据进行压缩。

Filter只有3个方法:

filter过滤器怎么在Java项目中使用

其中destroy()方法和init(…)方法是生命周期方法,因为过滤器无论如何都要在请求任何资源之前进行,所以任何Web应用在部署的时候,服务器就会调用Filter过滤器的init方法进行初始化,而关于过滤器的销毁,则是将该过滤器移除或者服务器关闭就会执行destory方法。

而我们通常要使用过滤器处理请求,则重点在于doFilter(…)方法。当请求要经过一个过滤器的时候,就会由服务器调用doFilter方法。

我们先来看看一个带有过滤器Filter的web应用的请求和响应流程:

filter过滤器怎么在Java项目中使用

记住:从请求到响应这个流程会经过Filter对象两次!

在doFilter这一个方法中就可以对着两次经过的过程进行处理,那么这里就有一个问题了,如果能通过过滤器,那么就到过滤器后面了,貌似应该是执行完doFilter方法了,而服务器的响应又经过过滤器,难道又要执行doFilter方法一次?但是这个方法里面的代码不是也有处理最开始请求的吗?

这就跟doFilter方法中的第三个参数FilterChain有关了,FilterChain对象是过滤器链,这个我们稍后会介绍。在FilterChain对象中只有一个方法:

filter过滤器怎么在Java项目中使用

=也是叫doFilter方法(千万别和Filter接口的doFilter方法弄混了)。简单的说下这个方法,只要调用了这个方法,就会将请求交给后面一个Filter进行过滤(一个Web应用中可以有多个Filter),如果该Filter是最后一个,那么调用该方法则将执行请求,也就是到我们的应用中获取资源。

因此从请求到响应这个流程经过Filter的两次处理分别是在FilterChain.doFilter方法的前面和后面!如下图所示:

filter过滤器怎么在Java项目中使用

那么下面我们就先以一个简单的例子来熟悉下Filter吧:

例1:

创建web工程FilterLearning,创建一个FilterDemo1类,同时这个类要实现javax.servlet.Filter接口。如下代码:

public class FilterDemo implements Filter {    @Override   public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {          System.out.println("hello filter");   }    //此处省略init方法和destory方法 }

写好Filter的Java代码还没完,还要在web应用下的web.xml文件中配置如下信息:

 <filter>    <filter-name>FilterDemo1</filter-name>    <filter-class>com.bjpowernode.web.filter.FilterDemo</filter-class>  </filter>    <filter-mapping>    <filter-name>FilterDemo1</filter-name>    <url-pattern>/*</url-pattern> </filter-mapping>

注意:因为我在<url-pattern>中配置为“/*”,则访问我wen应用中任何资源都会经过该Filter过滤器。如果只想对于index.jsp主页的请求进行过滤,可以设为<url-pattern>/index.jsp</url-pattern>。

我们在index.jsp中简单的使用JSP脚本来演示如果有请求来就输入一段文本到控制台上:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  <!DOCTYPE HTML> <html>  <head>     <title>index</title>  </head>    <body>   <%     System.out.println("Long live SD !");   %>  </body> </html>

接下来将该web应用部署到服务器中,我们就访问index.jsp,以下是我们访问了index.jsp后控制台的情况:

filter过滤器怎么在Java项目中使用

首先,我们可以保证在我们访问index.jsp后这个请求确实经过了Filter过滤器,但是我们的请求好像就只到过滤器而没有到我们真正需要的资源index.jsp?这是因为我们没有在Filter的doFilter方法中调用过滤器链FilterChain对象的doFilter方法,自然无法将请求继续往后面传递。我们将在例2中修改。

例2:

我们将例1中的FilterDemo1类进行修改,使其能访问到我们所需要的资源,很简单,在doFilter的方法中添加过滤器链FilterChain对象的doFilter方法即可:

public class FilterDemo implements Filter {    @Override   public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {          System.out.println("hello filter");     chain.doFilter(request, response);   }   //此处省略init方法和destory方法 }

其他如web.xml中的配置和index.jsp中的代码保持不变,现在我们再来访问下该web应用中的index.jsp,并观察控制台:

filter过滤器怎么在Java项目中使用

可以看到我们的请求经过过滤器,执行了过滤器的一段代码(System.out.println(“hello filter”)),然后将请求继续执行!正是因为FilterChain.doFilter方法才使我们通过过滤器继续向后寻找我们所需的资源。

那么还记得我们之前说过的从请求到响应会经过两次过滤器吗,是的在获取了我们所需的资源后还会到过滤器一趟,而至于这时候是否将响应再做处理取决于过滤器链FilterChain.doFilter方法后面还是否有代码。我们将在例3中完整的展现从请求到响应经过过滤器两次的流程。

例3:

我们将例2中的FilterDemo1类进行修改,只要在FilterChain.doFilter方法后面添加代码,就是第二次(即响应)经过过滤器所要执行的处理:

public class FilterDemo implements Filter {    @Override   public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {          System.out.println("hello filter");     chain.doFilter(request, response);     System.out.println("goodbye filter");   }   //此处省略init方法和destory方法 }

其他如web.xml中的配置和index.jsp中的代码保持不变,现在我们再来访问下该web应用中的index.jsp,并观察控制台:

filter过滤器怎么在Java项目中使用

这个结果证明了从请求到响应确实经过过滤器两次,同时也说明了在Filter的doFilter方法中“过滤——取资源——再过滤”执行的顺序。

现在我们再回到Filter接口的init方法,我们可以看到在这个方法内有一个参数FilterConfig,这个是由服务器传给我们的对象。如果我们在web.xml文件中配置了过滤器的初始化参数,就可以通过该FilterConfig对象来在代码中获取使用。

这个过滤器参数的初始化配置可以在<filter>标签中配置<init-param>,并在这个<init-param>标签下再配置<param-name>和<param-value>。

FilterConfig有如下方法:

filter过滤器怎么在Java项目中使用

当然如果我们是要获取配置的初始化参数则只需关注getInitParameter方法或getInitParameterNames方法。

一般来说我们可以在init方法中获取配置初始化参数并进行处理;也可以通过对象引用将FilterConfig对象在doFilter方法中处理参数,如例4所示。

例4:

在web.xml文件中配置过滤器和初始化参数:

 <filter>    <filter-name>FilterDemo1</filter-name>   <filter-class>com.bjpowernode.web.filter.FilterDemo1</filter-class>    <init-param>      <param-name>Love</param-name>      <param-value>LRR</param-value>    </init-param>  </filter>    <filter-mapping>    <filter-name>FilterDemo1</filter-name>    <url-pattern>/*</url-pattern> </filter-mapping>

在Java中编写Filter接口的实现类FilterDemo1:

public class FilterDemo implements Filter {   private FilterConfig filterConfig ;      @Override   public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {          String value = filterConfig.getInitParameter("Love");     System.out.println(value);   }      @Override   public void init(FilterConfig filterConfig) throws ServletException {     this.filterConfig = filterConfig;   }   //此处省略destroy方法 }

因为配置的原因,所以我们随便访问个资源都可以经过该过滤器,那么就访问index.jsp好了,看看控制台的结果:

filter过滤器怎么在Java项目中使用

正如我们在web.xml文件所配置的初始化参数一样。

上面介绍的都是只有一个Filter过滤器的情况下,有时候我们会因为要过滤的功能不同添加多个过滤器,这就有一个顺序的问题了,尤其是从取得资源后再返回到过滤器的顺序。下面这张图就能很清晰的看到我们要注意的顺序了:

filter过滤器怎么在Java项目中使用

例5:

来写两个Filter来说明下从请求到响应过滤器的处理顺序。

创建一个web工程,创建一个FilterDemo1类,同时这个类要实现javax.servlet.Filter接口。如下代码:

public class FilterDemo1 implements Filter {      public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {          System.out.println("Hello filter 1");     chain.doFilter(request, response);     System.out.println("Goodbye filter 1");   } //此处省略init方法和destroy方法 }

创建第二个Filter接口实现类FilterDemo2,代码如下:

 public class FilterDemo2 implements Filter {    public void doFilter(ServletRequest request, ServletResponse response,       FilterChain chain) throws IOException, ServletException {     System.out.println("Hello filter 2");     chain.doFilter(request, response);     System.out.println("Goodbye filter 2");     } //此处省略init方法和destroy方法 }

过滤器要想能被服务器调用,还必须要在该web工程下的web.xml中配置过滤器及其映射,而这个配置的顺序就是影响多个过滤器工作先后的顺序:

 <filter>    <filter-name>FilterDemo1</filter-name>   <filter-class>com.bjpowernode.web.filter.FilterDemo1</filter-class> </filter>    <filter-mapping>    <filter-name>FilterDemo1</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping>    <filter>    <filter-name>FilterDemo2</filter-name>    <filter-class>com.bjpowernode.web.filter.FilterDemo2</filter-class>  </filter>    <filter-mapping>    <filter-name>FilterDemo2</filter-name>    <url-pattern>/*</url-pattern> </filter-mapping>

而我们要访问的资源文件就以index.jsp为例好了,那么我们用一段JSP脚本通过在控制台打印来验证过滤器工作的顺序过程:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  <!DOCTYPE HTML> <html>  <head>     <title>index</title>  </head>    <body>   <%     System.out.println("Long live SD !");   %>  </body> </html>

现在启动服务器,部署该工程,通过访问index.jsp来看看控制台情况:

filter过滤器怎么在Java项目中使用

关于filter过滤器怎么在Java项目中使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

filter过滤器怎么在Java项目中使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

filter过滤器怎么在Java项目中使用

这篇文章将为大家详细讲解有关filter过滤器怎么在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预
2023-05-31

java filter过滤器怎么使用

在 Java 中使用过滤器(Filter)需要以下步骤:1. 创建一个类并实现 javax.servlet.Filter 接口。该接口定义了三个方法:init、doFilter 和 destroy。2. 在 init 方法中进行过滤器的初始
2023-09-06

怎么在java中使用Filter实现过滤

今天就跟大家聊聊有关怎么在java中使用Filter实现过滤,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应
2023-06-14

es6中filter过滤器怎么使用

这篇“es6中filter过滤器怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6中filter过滤器怎么使用”文
2023-07-05

AngularJS中的过滤器filter怎么使用

这篇文章主要介绍“AngularJS中的过滤器filter怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“AngularJS中的过滤器filter怎么使用”文章能帮助大家解决问题。在Angul
2023-07-04

Java中的过滤器Filter和监听器Listener怎么使用

本文小编为大家详细介绍“Java中的过滤器Filter和监听器Listener怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的过滤器Filter和监听器Listener怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路
2023-07-02

在 Java 中如何使用 stream().filter 方法来过滤特定的值?(java中怎么用stream().filter过滤特定的值)

在Java编程中,Stream是Java8引入的一个新特性,它提供了一种高效且函数式的方式来处理集合数据。其中,stream().filter方法是StreamAPI中常用的操作之一,用于过滤集合中的元素,只保留满足特定条件的元素。一、Str
在 Java 中如何使用 stream().filter 方法来过滤特定的值?(java中怎么用stream().filter过滤特定的值)
Java2024-12-19

怎么在JavaScript中使用filter过滤数组元素

怎么在JavaScript中使用filter过滤数组元素?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点
2023-06-14

Java 中 filter 过滤器的具体用法究竟是什么?(java中filter过滤器的用法是什么)

在Java编程中,filter过滤器是一个非常重要的概念和工具,它在处理请求和响应方面发挥着关键作用。一、Filter的基本概念Filter(过滤器)是JavaSer
Java 中 filter 过滤器的具体用法究竟是什么?(java中filter过滤器的用法是什么)
Java2024-12-16

如何在 Java Servlet 中使用过滤器?(怎样在java servelet中使用过滤器)

在JavaServlet开发中,过滤器(Filter)是一个非常有用的组件,它可以在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行拦截和处理。下面将详细介绍如何在JavaServlet中使用过滤器。一、过滤器的基本概念
如何在 Java Servlet 中使用过滤器?(怎样在java servelet中使用过滤器)
Java2024-12-20

java中filter过滤器的用法是什么

在Java中,过滤器(Filter)是一种用于在请求到达目标资源之前或之后执行某些操作的组件。过滤器可以用于实现对请求的拦截、修改或者增强,从而可以在请求被处理之前进行一些预处理,或者在请求处理完成后进行一些后处理。过滤器可以用于处理HTT
2023-10-11

Java过滤器Filter如何使用教程

这篇“Java过滤器Filter如何使用教程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java过滤器Filter如何使用
2023-07-05

JS中filter( )数组过滤器怎么用

这篇文章给大家分享的是有关JS中filter( )数组过滤器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言数组过滤器是前端数据处理的一种常用方法,对于前端来说,后端返回的数据我们需要经过处理以后才能
2023-06-25

Java过滤器Filter的基本使用教程

过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理。本文将通过示例为大家讲解Java中过滤器Filter的用法与实现,需要的可以参考一下
2023-02-22

如何在Java项目中使用过滤器、拦截器和监听器

如何在Java项目中使用过滤器、拦截器和监听器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录