Java filter中的chain.doFilter使用详解

 更新时间:2021年11月20日 10:02:38   作者:afaye_  
这篇文章主要介绍了Java filter中的chain.doFilter使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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(),业务无法继续往下处理;

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

相关文章

  • 浅谈Java编程中的单例设计模式

    浅谈Java编程中的单例设计模式

    这篇文章主要介绍了Java编程中的单例设计模式,在许多语言的编程过程当中单例模式都被开发者们广泛采用,需要的朋友可以参考下
    2015-07-07
  • Intellij IDEA 中调试 maven 插件的步骤

    Intellij IDEA 中调试 maven 插件的步骤

    这篇文章主要介绍了Intellij IDEA 中调试 maven 插件,本文分步骤给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • SpringBoot SpringSecurity JWT实现系统安全策略详解

    SpringBoot SpringSecurity JWT实现系统安全策略详解

    Spring Security是Spring的一个核心项目,它是一个功能强大且高度可定制的认证和访问控制框架。它提供了认证和授权功能以及抵御常见的攻击,它已经成为保护基于spring的应用程序的事实标准
    2022-11-11
  • java 如何使用org.w3c.dom操作XML文件

    java 如何使用org.w3c.dom操作XML文件

    这篇文章主要介绍了java 如何使用org.w3c.dom操作XML文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 情人节写给女朋友Java Swing代码程序

    情人节写给女朋友Java Swing代码程序

    这篇文章主要为大家分享了情人节写给女朋友的java小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,祝大家每天都是情人节
    2018-02-02
  • java高质量缩放图片的示例代码

    java高质量缩放图片的示例代码

    这篇文章主要介绍了java高质量缩放图片的示例代码,帮助大家更好的使用Java处理图片,感兴趣的朋友可以了解下
    2020-09-09
  • Mybatis实现查询相册数据列表流程讲解

    Mybatis实现查询相册数据列表流程讲解

    这篇文章主要介绍了Mybatis实现查询相册数据列表流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Java中两个字符串进行大小比较的方法

    Java中两个字符串进行大小比较的方法

    这篇文章主要介绍了Java中两个字符串进行大小比较,符串是否相等比较,只能使用equals()方法,不能使用“==”,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 使用Java构造和解析Json数据的两种方法(详解一)

    使用Java构造和解析Json数据的两种方法(详解一)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。接下来通过本文给大家介绍使用Java构造和解析Json数据的两种方法,需要的朋友参考下吧
    2016-03-03
  • Eclipse Web项目打成war包的方法图解

    Eclipse Web项目打成war包的方法图解

    当Tomcat启动后该压缩文件自动解压缩,war包方便了web工程的发布,那么Eclipse中如何将Web项目打成war包呢?下面小编通过图文并茂的方式给大家讲解下Eclipse Web项目打成war包的方法,一起看看吧
    2016-08-08

最新评论