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 , 如果沒(méi)有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è)置了字符編碼,如果沒(méi)有則進(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)沒(méi)有了,所以就會(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)文章
Intellij?IDEA?中調(diào)試?maven?插件的步驟
這篇文章主要介紹了Intellij?IDEA?中調(diào)試?maven?插件,本文分步驟給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
SpringBoot?SpringSecurity?JWT實(shí)現(xiàn)系統(tǒng)安全策略詳解
Spring?Security是Spring的一個(gè)核心項(xiàng)目,它是一個(gè)功能強(qiáng)大且高度可定制的認(rèn)證和訪問(wèn)控制框架。它提供了認(rèn)證和授權(quán)功能以及抵御常見(jiàn)的攻擊,它已經(jīng)成為保護(hù)基于spring的應(yīng)用程序的事實(shí)標(biāo)準(zhǔn)2022-11-11
Mybatis實(shí)現(xiàn)查詢相冊(cè)數(shù)據(jù)列表流程講解
這篇文章主要介紹了Mybatis實(shí)現(xiàn)查詢相冊(cè)數(shù)據(jù)列表流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
使用Java構(gòu)造和解析Json數(shù)據(jù)的兩種方法(詳解一)
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,采用完全獨(dú)立于語(yǔ)言的文本格式,是理想的數(shù)據(jù)交換格式。接下來(lái)通過(guò)本文給大家介紹使用Java構(gòu)造和解析Json數(shù)據(jù)的兩種方法,需要的朋友參考下吧2016-03-03
Eclipse Web項(xiàng)目打成war包的方法圖解
當(dāng)Tomcat啟動(dòng)后該壓縮文件自動(dòng)解壓縮,war包方便了web工程的發(fā)布,那么Eclipse中如何將Web項(xiàng)目打成war包呢?下面小編通過(guò)圖文并茂的方式給大家講解下Eclipse Web項(xiàng)目打成war包的方法,一起看看吧2016-08-08

