温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-20 14:24:09 来源:亿速云 阅读:166 作者:柒染 栏目:开发技术

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI