文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java filter中的chain.doFilter使用是怎样的

2023-06-25 16:39

关注

Java filter中的chain.doFilter使用是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

filter中的chain.doFilter使用

chain.doFilter作用

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

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

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

举例说明

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

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

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

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>

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>

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");//获得目标编码格式    }}

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯