第三篇Java中的Filter過(guò)濾器

Filter介紹

Filter是定義在javax.servlet包下面的一個(gè)接口,開(kāi)發(fā)web應(yīng)用時(shí),如果編寫(xiě)的Java類(lèi)實(shí)現(xiàn)了這個(gè)接口,則把這個(gè)java類(lèi)稱(chēng)之為過(guò)濾器Filter。

Filter過(guò)濾器的作用

Filter在web開(kāi)發(fā)中的作用圖如下:

Filter的主要作用是在web訪問(wèn)資源的時(shí)候進(jìn)行攔截,具體攔截下來(lái)需要做什么,可以自定義,比如說(shuō):1,處理全站中文亂碼的問(wèn)題;2,對(duì)網(wǎng)站內(nèi)容進(jìn)行敏感詞的過(guò)濾器功能;3,對(duì)用戶權(quán)限進(jìn)行判斷等等功能。

如何使用Filter

這個(gè)接口中只定義了3個(gè)方法,init(FilterConfig filterConfig)、destroy()和doFilter(ServletRequest request,ServletResponse response,FilterChain chain)。我們?cè)趯?shí)際開(kāi)發(fā)中一般只需要編寫(xiě)java類(lèi)實(shí)現(xiàn)Filter接口,并實(shí)現(xiàn)其doFilter方法。然后在 web.xml 文件中使用和元素對(duì)編寫(xiě)的Filter類(lèi)進(jìn)行注冊(cè),并設(shè)置它所能攔截的資源。

web.xml的配置格式如下:

果在啟動(dòng)中需要其他參數(shù)可以在配置文件d <filter>中使用<init-param>來(lái)配置

Filter的執(zhí)行流程

Filter的創(chuàng)建和銷(xiāo)毀由WEB服務(wù)器負(fù)責(zé)。 web 應(yīng)用程序啟動(dòng)時(shí),web 服務(wù)器將創(chuàng)建Filter 的實(shí)例對(duì)象,并調(diào)用其init方法,完成對(duì)象的初始化功能(init方法需要一個(gè)參數(shù)FilterConfig,這個(gè)參數(shù)可以讀取初始化的信息),從而為后續(xù)的用戶請(qǐng)求作好攔截的準(zhǔn)備工作(注:filter對(duì)象只會(huì)創(chuàng)建一次,init方法也只會(huì)執(zhí)行一次),web應(yīng)用移除或服務(wù)器停止時(shí),destroy()被調(diào)用。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以釋放過(guò)濾器使用的資源(比如內(nèi)存,文件句柄等)。

從官方API中可以看到,在執(zhí)行doFilter方法的時(shí)候除了帶上ServletRequestServletRequest之外,還有一個(gè)FilterChain這個(gè)對(duì)象,這個(gè)對(duì)象也有一個(gè)doFilter方法,F(xiàn)ilterChain這個(gè)對(duì)象的doFilter方法表示當(dāng)前攔截通過(guò),檢查后面的是否還有Filter,如果有繼續(xù)執(zhí)行下一Filter,如果沒(méi)有,那么后面的資源會(huì)被訪問(wèn)。

注意在web.xml文件中配置Filter是有順序的,先注冊(cè)的先執(zhí)行。

舉個(gè)栗子

package cn.quanbove;

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 FilterDemo1 implements Filter {

private FilterConfig config;//用于讀取初始化信息

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

String value = this.config.getInitParameter("xxx");

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

System.out.println("servletDemo1之前");

chain.doFilter(request, response);? //放行

System.out.println("servletDemo1之后!!");

}

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("filter被創(chuàng)建了!!");

this.config = filterConfig;

}

public void destroy() {

System.out.println("filter被銷(xiāo)毀了!!");

}

}

配置文件如下

這個(gè)例子執(zhí)行之后可以看到Filter初始化和銷(xiāo)毀以及執(zhí)行流程和操作方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容