Java filter中的chain.doFilter使用详解

目录
  • filter中的chain.doFilter使用
    • chain.doFilter作用
    • 举例说明
  • Filter中chain.doFilter(req, res)的理解
    • 用法

filter中的chain.doFilter使用

chain.doFilter作用

1.一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起

request -> filter1 -> filter2 ->filter3 -> …. -> request resource.

2.chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源

举例说明

1.input.jsp 是用来提交输入的 : 当提交后,过滤器检测姓名和年龄 .

2.如果正常的话会提交给output.jsp 如果不正常提交给erroroutput.jsp.

3.在此 , 同时也有一个过滤器,防止乱码问题存在 , 该过滤器检测一个页面是否设置了字符编码,如果没有则进行设置。

1.input.jsp

<form action="output.jsp" name="form" method="post">
    <table>
        <tr>
            <td>name</td>
            <td><input type="text" name="name" /></td>
        </tr>
        <tr>
            <td>age</td>
            <td><input type="text" name="age"/></td>
        </tr>
        <tr>
            <td><input type="submit" name="ok" value="ok"/></td>
        </tr>
    </table>
</form>

2.web.xml

<filter>
    <description></description>
    <display-name>encodefilter</display-name>
    <filter-name>encodefilter</filter-name>
    <filter-class>servletbean.encodefilter</filter-class>
    <init-param>
           <param-name>encoding</param-name>
           <param-value>GB2312</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodefilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <description></description>
    <display-name>myfilter</display-name>
    <filter-name>myfilter</filter-name>
    <filter-class>servletbean.myfilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myfilter</filter-name>
    <url-pattern>/output.jsp</url-pattern>
</filter-mapping>

3.encodefilter.java

package servletbean;
public class encodefilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(request.getCharacterEncoding()==null) {
            System.out.println(encoding);
            request.setCharacterEncoding(encoding);
        }
        chain.doFilter(request, response);//到下一个链
    }
    public void init(FilterConfig fConfig) throws ServletException {
        this.config=fConfig;
        encoding=fConfig.getInitParameter("encoding");//获得目标编码格式
    }
}

3.myfilter.java

package servletbean;
import javax.swing.JOptionPane;
public class myfilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/html");
        response.setCharacterEncoding("GB2312");
        PrintWriter out=response.getWriter();
        String name="";
        String age="";
        int age1;
        name=request.getParameter("name");
        age=request.getParameter("age");
        RequestDispatcher dispatch=request.getRequestDispatcher("erroroutput.jsp");
        if(name==null||name==""||name==" "||age==null) {
            JOptionPane.showMessageDialog(null,"用户名和年龄输入错误!");
            dispatch.forward(request, response);
            return;
        }
        else{
            try {
                age1=Integer.parseInt(age);
            }catch(Exception e){
                //JOptionPane.showMessageDialog(null,"年龄必须为数字!");
                dispatch.forward(request,response);
                return;//如果是错误页面就到erroroutput.jsp中
            }
        }
        //这里表示是正确的,也就是说,他回去找下一个链,但是它下面已经没有了,所以就会去跳转页面了,此跳转的页面就是action="output.jsp"了
        chain.doFilter(request, response);
        }
}

Filter中chain.doFilter(req, res)的理解

在写代码中,每次看到Filter(过滤器)中 chain.doFilter(req, res);都不懂为什么要加这一句,他的作用是什么;

代码下面也有:

@Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  ContentCachingRequestWrapper  req=new ContentCachingRequestWrapper((HttpServletRequest) request);
  ContentCachingResponseWrapper res=new ContentCachingResponseWrapper((HttpServletResponse) response);
  long startTime = System.currentTimeMillis();
  String serverUrl = req.getServletPath();
  //不懂这句什么意思
  chain.doFilter(req, res);
  long endTime = System.currentTimeMillis();
  try {
   int status = res.getStatus();
   String charset=res.getCharacterEncoding();
   //响应体
   String responsePayload = getPayLoad(res.getContentAsByteArray(),res.getCharacterEncoding());
   res.copyBodyToResponse();
   if(writeLogService==null) {
    writeLogService = (WriteLogService) ServiceLocator.getInstance().getCtx().getBean("writeLogServiceImpl");
   }
 writeLogService.writeLog(startTime,endTime,serverUrl,postparams,status,responsePayload,charset);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

用法

在doFilter()方法中,在chain.doFilter()之前的代码,一般是对request执行的过滤操作;

在chain.doFilter()后面的代码,一般是对response执行的操作;

chain.doFiter()执行下一个过滤器或者业务处理器。

如果在doFilter()方法中,不写chain.doFilter(),业务无法继续往下处理;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java过滤器中Filter的ChainFilter过滤链

    1.什么是过滤器? 在客户端到服务器的过程中,当发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行,在服务器给客户端响应时也会进行判断 如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行. OOP:Java面向对象编程,抽象.封装.继承.多态. AOP:面向切面编程,过滤器就是一个面向切面的编程思想. AOP是sun公司srvlet2.3版本之后推出的新功能,在2.3之前的版本没有该功能,定义一个过滤器需要实现(implement)Filter接口,这

  • java 过滤器filter防sql注入的实现代码

    实例如下: XSSFilter.java public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws IOException, ServletException { //flag = true 只做URL验证; flag = false 做所有字段的验证; boolean flag = true; if(flag){ //只

  • 浅谈Java中的Filter过滤器

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理.使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交

  • springboot中filter的用法详解

    一.在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别. 二.filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter

  • Java filter中的chain.doFilter使用详解

    目录 filter中的chain.doFilter使用 chain.doFilter作用 举例说明 Filter中chain.doFilter(req, res)的理解 用法 filter中的chain.doFilter使用 chain.doFilter作用 1.一般filter都是一个链,web.xml 里面配置了几个就有几个.一个一个的连在一起 request -> filter1 -> filter2 ->filter3 -> -. -> request resourc

  • Java编程中的HashSet和BitSet详解

    Java编程中的HashSet和BitSet详解 我在Apache的开发邮件列表中发现一件很有趣的事,Apache Commons包的ArrayUtils类的removeElements方法,原先使用的HashSet现在换成了BitSet. HashSet<Integer> toRemove = new HashSet<Integer>(); for (Map.Entry<Character, MutableInt> e : occurrences.entrySet()

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • java web中对json的使用详解

    一.在Java Web的开发过程中,如果希望调用Java对象转化成JSON对象等操作.则需要引入以下jar包,不然运行时则报错. 1.commons-beanutils.jar 2.commons-collections.jar 3.commons-lang.jar 4.commons-logging-1.1.jar 5.ezmorph-1.0.3.jar 6.json-lib-2.0-jdk15.jar 7.有人说还需要 commons-httpclient.jar 引入成功之后,使用JSON

  • Java开发中为什么要使用单例模式详解

    一.什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非常简单.一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式. 二.实战案例一:处理资源访问冲突 我们先来看第一个例子.在这个例子中,我们自定义实现了一个往文件中打印日志的 Logger 类.具体的代码实现如下所示: public class Logger { private FileWriter writer; public Logger() {

  • Java开发中的23种设计模式详解(推荐)

    设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

  • 优雅地在Java 8中处理异常的方法详解

    前言 Java 8 引入的流 (Stream) API 和 lambda 表达式为我们打开了新世界的大门,自此之后我们也可以在 Java 中进行函数式编程了.然而,在实际工作中,许多小伙伴并不知道如何正确的在 lambda 中处理异常,今天就来给大家讲解一下. 小编给大家推荐一个Java技术交流群:937053620!群内提供设计模式.spring/mybatis源码分析.高并发与分布式.微服务.性能优化,面试题整合文档等免费资料!给大家提供一个交流学习的平台! 我们都知道,Java 异常分为检

  • java开发中遇到的异常汇总详解

    异常 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityException 文件已结束异常:EOFException 文件未找到异常:FileNotFoundException 字符串转换为数字异常:Numb

  • Java系统中拆分同步和异步详解

    前言 很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的例子是用Java编写的,但我相信它更多的是基本原理,同一个应用程序可以用任何语言来重新写. 所需的工具和库: Spring Boot RabbitMQ 1.Web应用程序 一个用Spring MVC编写的Web应用程序并运行在Tomcat上. 它所做的只是将一个字符串发送到一个队列中 (异步通

  • Java Web开发中过滤器和监听器使用详解

    目录 1 Filter 1.1 Filter简介 1.2 Filter的快速入门 1.2.1 创建Filter类 1.2.2 访问index.jsp 1.3 Filter的拦截路径的配置 1.4 过滤器链 1.4.1 过滤器链简介 1.4.2 过滤器链的例子 2 Listener 2.1 概念 2.2 监听器的使用 1 Filter 1.1 Filter简介 Filter表示过滤器,是JavaWeb三大组件(Servlet.Filter.Listener)之一. 过滤器可以把资源的请求拦截下来,

随机推荐