008_过滤器
一. 過濾器
1. 過濾器其實(shí)就是對客戶端(瀏覽器)發(fā)出來的請求進(jìn)行過濾。客戶端(瀏覽器)發(fā)出請求, 然后服務(wù)器派servlet處理, 在中間可以添加過濾器, 其實(shí)過濾器起到的是攔截的作用。
2. 過濾器作用
2.1.?對一些敏感詞匯進(jìn)行過濾
2.2.?統(tǒng)一設(shè)置編碼
2.3.?自動(dòng)登錄
3. 過濾器的生命周期例子
3.1. 新建一個(gè)名叫FilterLifeCycle的Web項(xiàng)目
3.2. 定義過濾器, 需要實(shí)現(xiàn)Servlet的Filter接口
package com.lywgames.filterlifecycle;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;/*** 自定義過濾器需要實(shí)現(xiàn)Servlet的Filter接口*/ public class MyFilter implements Filter {@Overridepublic void init(FilterConfig config) throws ServletException {System.out.println("在服務(wù)器加載項(xiàng)目的時(shí)候創(chuàng)建, 初始化。");}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {System.out.println("進(jìn)入到過濾器了, 可以進(jìn)行過濾操作了。");// 本過濾器放行, 你可以去下一個(gè)過濾器或者Servlet了chain.doFilter(req, res);}@Overridepublic void destroy() {System.out.println("服務(wù)器停止或者移除項(xiàng)目的時(shí)候的銷毀。");} }3.3. 新建一個(gè)index.html
<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>過濾器生命周期</title></head><body><h1>過濾器生命周期</h1></body> </html>3.4. 在web.xml里注冊過濾器和過濾器映射
3.5. 過濾器放行, 請求才能到達(dá)下一個(gè)過濾器、Servlet或者資源文件。過濾器放行方法是在doFilter方法里調(diào)用chain.doFilter進(jìn)行放行。
3.6. 運(yùn)行項(xiàng)目, 過濾器被初始化了, 也進(jìn)入了過濾器操作方法, 如果我們在過濾器操作方法中放行的話, 才會(huì)進(jìn)入主頁; 如果不方行, 不會(huì)到達(dá)主頁
3.7. 正常關(guān)閉服務(wù)器, 銷毀了過濾器
4. 過濾器的生命周期
4.1. 在服務(wù)器加載項(xiàng)目的時(shí)候創(chuàng)建, 初始化。
4.2. 服務(wù)器停止或者移除項(xiàng)目的時(shí)候的銷毀。
5. 過濾器的執(zhí)行順序
5.1. 單個(gè)過濾器的執(zhí)行順序: 客戶端(瀏覽器)發(fā)出請求, 經(jīng)過過濾器, 如果過濾器放行, 才能到達(dá)Servlet或者資源文件。
5.2. 多個(gè)過濾器的執(zhí)行順序: 如果有多個(gè)過濾器, 那么他們會(huì)按照過濾器注冊的映射順序來排隊(duì)。請求經(jīng)過一系列過濾器, 到達(dá)Servlet或者資源文件。
6. 過濾器的init方法的參數(shù)FilterConfig, 可以用于獲取filter在注冊的時(shí)候的名字以及初始化參數(shù)。
7. dispatcher設(shè)置
7.1. REQUEST: 只要是請求過來, 都攔截, 默認(rèn)就是REQUEST。
7.2. FORWARD: 只要是轉(zhuǎn)發(fā)都攔截。
7.3. ERROR:?頁面出錯(cuò)發(fā)生跳轉(zhuǎn)。?
7.4. INCLUDE:?包含頁面的時(shí)候就攔截。
8. 過濾器鏈例子
8.1. 新建一個(gè)名叫FilterLifeCycle的Web項(xiàng)目
8.2. 新建一個(gè)MyFilter1.java
package com.lywgames.filterlifecycle;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;public class MyFilter1 implements Filter {@Overridepublic void init(FilterConfig config) throws ServletException {String filterName = config.getFilterName();String param1 = config.getInitParameter("param1");System.out.println("filterName = " + filterName);System.out.println("param1 = " + param1);}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {System.out.println("請求進(jìn)入到過濾器1");chain.doFilter(req, res);System.out.println("請求經(jīng)過Servlet處理后, 返回到過濾器1");}@Overridepublic void destroy() {System.out.println("銷毀過濾器1");} }8.3. 新建一個(gè)MyFilter2.java
package com.lywgames.filterlifecycle;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;public class MyFilter2 implements Filter {@Overridepublic void init(FilterConfig config) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {System.out.println("請求進(jìn)入到過濾器2");chain.doFilter(req, res);System.out.println("請求經(jīng)過Servlet處理后, 返回到過濾器2");}@Overridepublic void destroy() {System.out.println("銷毀過濾器2");} }8.4. 新建一個(gè)MyFilter3.java
package com.lywgames.filterlifecycle;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;public class MyFilter3 implements Filter {@Overridepublic void init(FilterConfig config) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {System.out.println("請求進(jìn)入到過濾器3");chain.doFilter(req, res);System.out.println("請求經(jīng)過Servlet處理后, 返回到過濾器3");}@Overridepublic void destroy() {System.out.println("銷毀過濾器3");} }8.5. 新建一個(gè)index.html
<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>主頁面</title></head><body><h1>主頁面</h1></body> </html>8.6. 在web.xml里注冊過濾器和過濾器映射, 過濾器初始化參數(shù)
8.7. 運(yùn)行項(xiàng)目
8.8. 關(guān)閉服務(wù)器, 銷毀過濾器
總結(jié)
- 上一篇: 007_监听器
- 下一篇: 009_BeanUtils的使用