什么是過濾器往毡?
過濾器是一個(gè)程序赌渣,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息线罕。在這之后,過濾器可以作如下的選擇:
①以常規(guī)的方式調(diào)用資源(即窃判,調(diào)用servlet或JSP頁(yè)面)钞楼。
②利用修改過的請(qǐng)求信息調(diào)用資源。
③調(diào)用資源袄琳,但在發(fā)送響應(yīng)到客戶機(jī)前對(duì)其進(jìn)行修改询件。
④阻止該資源調(diào)用,代之以轉(zhuǎn)到其他的資源唆樊,返回一個(gè)特定的狀態(tài)代碼或生成替換輸出宛琅。
過濾器的基本原理
在Servlet作為過濾器使用時(shí),它可以對(duì)客戶的請(qǐng)求進(jìn)行處理逗旁。處理完成后嘿辟,它會(huì)交給下一個(gè)過濾器處理,這樣片效,客戶的請(qǐng)求在過濾鏈里逐個(gè)處理红伦,直到請(qǐng)求發(fā)送到目標(biāo)為止。例如淀衣,某網(wǎng)站里有提交“修改的注冊(cè)信息”的網(wǎng)頁(yè)色建,當(dāng)用戶填寫完修改信息并提交后,服務(wù)器在進(jìn)行處理時(shí)需要做兩項(xiàng)工作:判斷客戶端的會(huì)話是否有效舌缤;對(duì)提交的數(shù)據(jù)進(jìn)行統(tǒng)一編碼箕戳。這兩項(xiàng)工作可以在由兩個(gè)過濾器組成的過濾鏈里進(jìn)行處理。當(dāng)過濾器處理成功后国撵,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo)陵吸;如果過濾器處理不成功,將把視圖派發(fā)到指定的錯(cuò)誤頁(yè)面介牙。
過濾器設(shè)計(jì)執(zhí)行流程
- 用戶訪問服務(wù)器
- 過濾器: 對(duì)Servlet請(qǐng)求進(jìn)行攔截
- 先進(jìn)入過濾器壮虫, 過濾器處理
- 過濾器處理完后, 在放行环础, 此時(shí)囚似,請(qǐng)求到達(dá)Servlet/JSP
- Servlet處理
- Servlet處理完后,再回到過濾器, 最后在由tomcat服務(wù)器相應(yīng)用戶线得;
- 過濾器相關(guān)的Api
- interface Filter 過濾器核心接口
1.void init(filterConfig);
初始化方法饶唤,在服務(wù)器啟動(dòng)時(shí)執(zhí)行
2.void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain);
過濾器攔截的業(yè)務(wù)處理方法
3.void destory();
銷毀過濾器的時(shí)候調(diào)用 - interface FilterConfig 獲取初始化參數(shù)信息
1.getInitParameter(java.lang.String.name);
該方法獲取指定名稱的值
2.getInitParameterNames()
用獲取所有參數(shù)的名稱,放進(jìn)集合Enumeration - interface FilterChain 過濾器參數(shù)鏈;一個(gè)個(gè)過濾器執(zhí)行形成一個(gè)執(zhí)行鏈
1.void doFilter(ServletRequest request, ServletResponse response);
執(zhí)行下一個(gè)過濾器或放行
過程
1.繼承Filter贯钩,并實(shí)現(xiàn)其三個(gè)方法
package servlet;
import javax.servlet.*;
import java.io.IOException;
public class filterDemo implements Filter {
//創(chuàng)建實(shí)例
public filterDemo() {
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
public void destroy() {
}
}
demo
- 先在web.xml中配置
<filter>
<filter-name>Hello_Filter</filter-name>
<filter-class>servlet.HelloFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>namespace</param-name>
<param-value>4566456</param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>c.///</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Hello_Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.代碼部分
//獲取過濾器在web.xml中的配置的初始化參數(shù)
Enumeration<String> enumeration = filterConfig.getInitParameterNames(); //獲取所有參數(shù)的名稱募狂,放進(jìn)集合中
//while循環(huán)遍歷
while (enumeration.hasMoreElements()) { //hasMoreElements()判斷集合中是否還有數(shù)據(jù)
//獲取參數(shù)名稱
String name = enumeration.nextElement();
//獲取參數(shù)名稱對(duì)應(yīng)的值
String value = filterConfig.getInitParameter(name);
System.out.println(name + "\t" + value);
}
3.獲取web.xml的配置參數(shù)及對(duì)應(yīng)的值
對(duì)指定的請(qǐng)求攔截
/* 表示攔截所有的請(qǐng)求
<filter-mapping>
<filter-name>filterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
攔截指定的jsp
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/list.jsp</url-pattern>
攔截所有的jsp
<url-pattern>*.jsp</url-pattern>
根據(jù)servlet的內(nèi)部名稱攔截
<servlet-name>IndexServlet</servlet-name>
攔截指定的servlet
<url-pattern>/index</url-pattern>
指定攔截指定的類型
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>