Java filter中的chain.doFilter使用詳解
filter中的chain.doFilter使用
chain.doFilter作用
1.一般filter都是一個(gè)鏈,web.xml 里面配置了幾個(gè)就有幾個(gè)。一個(gè)一個(gè)的連在一起
request -> filter1 -> filter2 ->filter3 -> …. -> request resource.
2.chain.doFilter將請(qǐng)求轉(zhuǎn)發(fā)給過(guò)濾器鏈下一個(gè)filter , 如果沒有filter那就是你請(qǐng)求的資源
舉例說(shuō)明
1.input.jsp 是用來(lái)提交輸入的 : 當(dāng)提交后,過(guò)濾器檢測(cè)姓名和年齡 .
2.如果正常的話會(huì)提交給output.jsp 如果不正常提交給erroroutput.jsp.
3.在此 , 同時(shí)也有一個(gè)過(guò)濾器,防止亂碼問(wèn)題存在 , 該過(guò)濾器檢測(cè)一個(gè)頁(yè)面是否設(shè)置了字符編碼,如果沒有則進(jìn)行設(shè)置。
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);//到下一個(gè)鏈 } public void init(FilterConfig fConfig) throws ServletException { this.config=fConfig; encoding=fConfig.getInitParameter("encoding");//獲得目標(biāo)編碼格式 } }
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,"用戶名和年齡輸入錯(cuò)誤!"); dispatch.forward(request, response); return; } else{ try { age1=Integer.parseInt(age); }catch(Exception e){ //JOptionPane.showMessageDialog(null,"年齡必須為數(shù)字!"); dispatch.forward(request,response); return;//如果是錯(cuò)誤頁(yè)面就到erroroutput.jsp中 } } //這里表示是正確的,也就是說(shuō),他回去找下一個(gè)鏈,但是它下面已經(jīng)沒有了,所以就會(huì)去跳轉(zhuǎn)頁(yè)面了,此跳轉(zhuǎn)的頁(yè)面就是action="output.jsp"了 chain.doFilter(request, response); } }
Filter中chain.doFilter(req, res)的理解
在寫代碼中,每次看到Filter(過(guò)濾器)中 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(); //響應(yīng)體 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()之前的代碼,一般是對(duì)request執(zhí)行的過(guò)濾操作;
在chain.doFilter()后面的代碼,一般是對(duì)response執(zhí)行的操作;
chain.doFiter()執(zhí)行下一個(gè)過(guò)濾器或者業(yè)務(wù)處理器。
如果在doFilter()方法中,不寫chain.doFilter(),業(yè)務(wù)無(wú)法繼續(xù)往下處理;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解
漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java與C++分別實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-05-05jdbc實(shí)現(xiàn)用戶注冊(cè)功能代碼示例
這篇文章主要介紹了jdbc實(shí)現(xiàn)用戶注冊(cè)功能,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用
這篇文章主要介紹了JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法
這篇文章主要介紹了詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java Set接口及常用實(shí)現(xiàn)類總結(jié)
Collection的另一個(gè)子接口就是Set,他并沒有我們List常用,并且自身也沒有一些額外的方法,全是繼承自Collection中的,因此我們還是簡(jiǎn)單總結(jié)一下,包括他的常用實(shí)現(xiàn)類HashSet、LinkedHashSet、TreeSet的總結(jié)2023-01-01springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題
這篇文章主要介紹了springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09解決java.lang.NullPointerException報(bào)錯(cuò)以及分析出現(xiàn)的幾種原因
這篇文章介紹了解決java.lang.NullPointerException報(bào)錯(cuò)的方法,以及分析出現(xiàn)的幾種原因。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12