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ā)給過濾器鏈下一個(gè)filter , 如果沒有filter那就是你請(qǐng)求的資源
舉例說明
1.input.jsp 是用來提交輸入的 : 當(dāng)提交后,過濾器檢測(cè)姓名和年齡 .
2.如果正常的話會(huì)提交給output.jsp 如果不正常提交給erroroutput.jsp.
3.在此 , 同時(shí)也有一個(gè)過濾器,防止亂碼問題存在 , 該過濾器檢測(cè)一個(gè)頁面是否設(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ò)誤頁面就到erroroutput.jsp中
}
}
//這里表示是正確的,也就是說,他回去找下一個(gè)鏈,但是它下面已經(jīng)沒有了,所以就會(huì)去跳轉(zhuǎn)頁面了,此跳轉(zhuǎn)的頁面就是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();
//響應(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í)行的過濾操作;
在chain.doFilter()后面的代碼,一般是對(duì)response執(zhí)行的操作;
chain.doFiter()執(zhí)行下一個(gè)過濾器或者業(yè)務(wù)處理器。
如果在doFilter()方法中,不寫chain.doFilter(),業(yè)務(wù)無法繼續(xù)往下處理;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java與C++分別用遞歸實(shí)現(xiàn)漢諾塔詳解
漢諾塔問題是一個(gè)經(jīng)典的問題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說。本文將用Java與C++分別實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-05-05
jdbc實(shí)現(xiàn)用戶注冊(cè)功能代碼示例
這篇文章主要介紹了jdbc實(shí)現(xiàn)用戶注冊(cè)功能,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用
這篇文章主要介紹了JSR303校驗(yàn)注解和自定義校驗(yàn)注解的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法
這篇文章主要介紹了詳解Spring 框架中切入點(diǎn) pointcut 表達(dá)式的常用寫法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Java Set接口及常用實(shí)現(xiàn)類總結(jié)
Collection的另一個(gè)子接口就是Set,他并沒有我們List常用,并且自身也沒有一些額外的方法,全是繼承自Collection中的,因此我們還是簡(jiǎn)單總結(jié)一下,包括他的常用實(shí)現(xiàn)類HashSet、LinkedHashSet、TreeSet的總結(jié)2023-01-01
springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問題
這篇文章主要介紹了springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問題,本文給大家介紹的非常詳細(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

