黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 filter菜鳥教程的詳細(xì)講解

filter菜鳥教程的詳細(xì)講解

更新時(shí)間:2020-09-10 14:38:36 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1737次


Filter,過(guò)濾器,顧名思義,即是對(duì)數(shù)據(jù)等的過(guò)濾,預(yù)處理過(guò)程。為什么要引入過(guò)濾器呢?在平常訪問(wèn)網(wǎng)站的時(shí)候,有時(shí)候發(fā)一些敏感的信息,發(fā)出后顯示時(shí)就會(huì)將敏感信息用*等字符替代,這就是用過(guò)濾器對(duì)信息進(jìn)行了處理。這只是一個(gè)簡(jiǎn)單的例子,當(dāng)然,過(guò)濾器那么強(qiáng)大,它的功能也不可能局限于此,它不僅能預(yù)處理數(shù)據(jù),只要是發(fā)送過(guò)來(lái)的請(qǐng)求它都是可以預(yù)處理的,同時(shí),它還可以對(duì)服務(wù)器返回的響應(yīng)進(jìn)行預(yù)處理,這樣,大大減輕了服務(wù)器的壓力。例如,實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問(wèn)控制、過(guò)濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。下面來(lái)詳細(xì)介紹一下過(guò)濾器。


一、定義


學(xué)習(xí)一個(gè)東西,我們首先要理解它的定義。


1.概念


過(guò)濾作用,對(duì)從客戶端向服務(wù)器端發(fā)送的請(qǐng)求進(jìn)行過(guò)濾,也可以對(duì)服務(wù)器端返回的響應(yīng)進(jìn)行處理。它使用戶可以改變一個(gè)request和修改一個(gè)response.。Filter不是一個(gè)servlet,它不能產(chǎn)生一個(gè)response,但是它能夠在一個(gè)request到達(dá)servlet之前預(yù)處理request,也可以在response離開(kāi)servlet時(shí)處理response。換句話說(shuō),filter其實(shí)是客戶端與servlet中間的一個(gè)傳遞者,并且它可以對(duì)要傳遞的東西進(jìn)行修改。


filter菜鳥教程


注意:過(guò)濾器是用來(lái)攔截請(qǐng)求和響應(yīng)的,不能產(chǎn)生響應(yīng),而servlet是用來(lái)處理請(qǐng)求并產(chǎn)生響應(yīng)的。


2.適用場(chǎng)合


實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問(wèn)控制,過(guò)濾敏感詞匯,壓縮響應(yīng)信息等。


3.過(guò)濾器如何實(shí)現(xiàn)攔截


當(dāng)客戶端發(fā)生請(qǐng)求后,在HttpServletRequest到達(dá)Servlet之前,過(guò)濾器攔截客戶的HttpServletRequest。


根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數(shù)據(jù)。


在過(guò)濾器中調(diào)用doFilter方法,對(duì)請(qǐng)求放行。請(qǐng)求到達(dá)Servlet后,對(duì)請(qǐng)求進(jìn)行處理并產(chǎn)生HttpServletResponse發(fā)送給客戶端。


在HttpServletResponse到達(dá)客戶端之前,過(guò)濾器攔截HttpServletResponse。


根據(jù)需要檢查HttpServletResponse,可以修改HttpServletResponse頭和數(shù)據(jù)。


最后,HttpServletResponse到達(dá)客戶端。


4.Filter接口


Servlet API提供了一個(gè)Filter接口,編寫的過(guò)濾器必須實(shí)現(xiàn)該接口。


5.Filter的生命周期


(1)Filter接口中有三個(gè)重要的方法。


init()方法:初始化參數(shù),在創(chuàng)建Filter時(shí)自動(dòng)調(diào)用。當(dāng)我們需要設(shè)置初始化參數(shù)的時(shí)候,可以寫到該方法中。


doFilter()方法:攔截到要執(zhí)行的請(qǐng)求時(shí),doFilter就會(huì)執(zhí)行。這里面寫我們對(duì)請(qǐng)求和響應(yīng)的預(yù)處理。


destroy()方法:在銷毀Filter時(shí)自動(dòng)調(diào)用。


(2)Filter的生命周期


Filter的創(chuàng)建和銷毀由web服務(wù)器控制。


服務(wù)器啟動(dòng)的時(shí)候,web服務(wù)器創(chuàng)建Filter的實(shí)例對(duì)象,并調(diào)用其init方法,完成對(duì)象的初始化功能。filter對(duì)象只會(huì)創(chuàng)建一次,init方法也只會(huì)執(zhí)行一次。


攔截到請(qǐng)求時(shí),執(zhí)行doFilter方法。可以執(zhí)行多次。


服務(wù)器關(guān)閉時(shí),web服務(wù)器銷毀Filter的實(shí)例對(duì)象。


6.Filter對(duì)象——FilterConfig


用戶在配置filter時(shí),可以使用<init-param>為filter配置一些初始化參數(shù),當(dāng)web容器實(shí)例化Filter對(duì)象,調(diào)用其init方法時(shí),會(huì)把封裝了filter初始化參數(shù)的filterConfig對(duì)象傳遞進(jìn)來(lái)。因此開(kāi)發(fā)人員在編寫filter時(shí),通過(guò)filterConfig對(duì)象的方法,就可獲得:


String getFilterName():得到filter的名稱。


String getInitParameter(String name):返回在部署描述中指定名稱的初始化參數(shù)的值。如果不存在返回null.


Enumeration getInitParameterNames():返回過(guò)濾器的所有初始化參數(shù)的名字的枚舉集合。


public ServletContext getServletContext():返回Servlet上下文對(duì)象的引用。


7.過(guò)濾器鏈——FilterChain


一組過(guò)濾器對(duì)某些web資源進(jìn)行攔截,那么這組過(guò)濾器就稱為過(guò)濾器鏈。過(guò)濾器的執(zhí)行順序和<filter-mapping>有關(guān)(誰(shuí)在前先執(zhí)行誰(shuí))。


filter菜鳥教程


二、開(kāi)發(fā)步驟


了解了過(guò)濾器的相關(guān)概念,接下來(lái)進(jìn)行實(shí)例開(kāi)發(fā)。


1.編寫步驟


編寫java類實(shí)現(xiàn)Filter接口,并實(shí)現(xiàn)其doFilter方法。


在web.xml文件中使用<filter>和<filter-mapping>元素對(duì)編寫的filter類進(jìn)行注冊(cè),并設(shè)置它所能攔截的資源。


2.示例


(1)簡(jiǎn)單的Filter示例


編寫FilterDemo1類


 package com.oracle.filter;

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{ /* * 對(duì)Filter的整個(gè)生命周期了解的一個(gè)案例 * 注意事項(xiàng): * 1.實(shí)現(xiàn)Filter接口時(shí)導(dǎo)入的是javax.servlet.Filter包 * 2.方法均有web服務(wù)器自動(dòng)調(diào)用,不需我們手動(dòng)調(diào)用 * 3.init方法中一般寫初始化參數(shù),這里先不用,后面的例子再使用。 * 4.destroy方法一般不需要寫任何代碼 * 5.重寫doFilter方法,可以寫我們對(duì)攔截的請(qǐng)求和響應(yīng)的處理動(dòng)作。 * 6.寫完該類后配置filter,在web.xml中配置。 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub System.out.println("FilterDemo1的init方法被調(diào)用"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("我是FilterDemo1,客戶端向Servlet發(fā)送的請(qǐng)求被我攔截到了"); chain.doFilter(request, response); System.out.println("我是FilterDemo1,Servlet向客戶端發(fā)送的響應(yīng)被我攔截到了"); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("FilterDemo1的destroy方法被調(diào)用"); }}


配置filter,在web.xml文件中加入下面這段代碼


<filter>

 <filter-name>filterDemo1</filter-name> <filter-class>com.oracle.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>filterDemo1</filter-name> <url-pattern>/*</url-pattern> <!-- /*是對(duì)所有的文件進(jìn)行攔截 --> </filter-mapping>


控制臺(tái)結(jié)果


filter菜鳥教程


分析:從上面結(jié)果可以看出,在服務(wù)器啟動(dòng)時(shí),就調(diào)用了init方法,當(dāng)訪問(wèn)頁(yè)面時(shí),該過(guò)濾器攔截到請(qǐng)求執(zhí)行doFilter方法,在該方法中,使用doFilter方法,當(dāng)返回響應(yīng)后,繼續(xù)執(zhí)行剩下的代碼,執(zhí)行完成后將響應(yīng)傳給客戶端。當(dāng)關(guān)閉服務(wù)器時(shí),服務(wù)器就調(diào)用了destroy方法。


(2)Filter鏈?zhǔn)纠?/p>


編寫FilterDemo1類


package com.oracle.filter;

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{ /* * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("我是FilterDemo1,客戶端向Servlet發(fā)送的請(qǐng)求被我攔截到了"); //對(duì)請(qǐng)求放行,進(jìn)入下一個(gè)過(guò)濾器FilterDemo2 chain.doFilter(request, response); System.out.println("我是FilterDemo1,Servlet向客戶端發(fā)送的響應(yīng)被我攔截到了"); } @Override public void destroy() { // TODO Auto-generated method stub }}


編寫FilterDemo2類


package com.oracle.filter;

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 FilterDemo2 implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("我是FilterDemo2,客戶端向Servlet發(fā)送的請(qǐng)求被我攔截到了"); //對(duì)請(qǐng)求放行,進(jìn)入Servlet chain.doFilter(request, response); System.out.println("我是FilterDemo2,Servlet向客戶端發(fā)送的響應(yīng)被我攔截到了"); } @Override public void destroy() { // TODO Auto-generated method stub }}


配置filter,在web.xml文件中加入下面這段代碼


<filter>

 <filter-name>filterDemo1</filter-name> <filter-class>com.oracle.filter.FilterDemo1</filter-class> </filter> <filter> <filter-name>filterDemo2</filter-name> <filter-class>com.oracle.filter.FilterDemo2</filter-class> </filter> <filter-mapping> <filter-name>filterDemo1</filter-name> <url-pattern>/*</url-pattern> <!-- /*是對(duì)所有的文件進(jìn)行攔截 --> </filter-mapping> <filter-mapping> <filter-name>filterDemo2</filter-name> <url-pattern>/*</url-pattern> <!-- /*是對(duì)所有的文件進(jìn)行攔截 --> </filter-mapping>


控制臺(tái)結(jié)果


filter菜鳥教程


分 析:當(dāng)有多個(gè)過(guò)濾器對(duì)同一個(gè)請(qǐng)求進(jìn)行攔截時(shí),根據(jù)web.xml文件中<filter-mapping>的配置順序,誰(shuí)在前,先執(zhí)行誰(shuí)。當(dāng)?shù)?一過(guò)濾器攔截成功后,會(huì)執(zhí)行doFilter方法,該方法中,調(diào)用chain.doFilter方法,會(huì)將該請(qǐng)求放行給下一個(gè)過(guò)濾器,依次執(zhí)行,直到執(zhí)行 到最后一個(gè)過(guò)濾器,當(dāng)最后一個(gè)過(guò)濾器調(diào)用chain.doFilter方法時(shí),請(qǐng)求會(huì)被放行給Servlet,當(dāng)Servlet處理返回響應(yīng)信息時(shí),先返 回到最后執(zhí)行的過(guò)濾器,繼續(xù)執(zhí)行該過(guò)濾器剩下的代碼。依次返回,直到返回到第一個(gè)過(guò)濾器,最后返回給客戶端。


(3)禁用所有動(dòng)態(tài)頁(yè)面的緩存過(guò)濾器


編寫FilterDemo3類


package com.oracle.filter;

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;import javax.servlet.http.HttpServletResponse;public class FilterDemo3 implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在response的頭部設(shè)置Cache-Control、Pragma和Expires即可取消緩存 HttpServletResponse resp = (HttpServletResponse)response; resp.setHeader("Cache-Control", "no-cache"); resp.setHeader("Pragma", "no-cache"); resp.setDateHeader("Expires", -1); chain.doFilter(request, resp); } @Override public void destroy() { // TODO Auto-generated method stub }}


配置filter,在web.xml文件中加入下面這段代碼


<filter>

 <filter-name>filterDemo3</filter-name> <filter-class>com.oracle.filter.FilterDemo3</filter-class> </filter> <filter-mapping> <filter-name>filterDemo3</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>


(4)分IP統(tǒng)計(jì)網(wǎng)站的訪問(wèn)次數(shù)過(guò)濾器


編寫FilterDemo4類


package com.oracle.filter;

import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class FilterDemo4 implements Filter{ private FilterConfig filterConfig; @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub //初始化參數(shù),ipCount用來(lái)存放ip及訪問(wèn)次數(shù) ServletContext application = filterConfig.getServletContext(); Map<String,Integer> ipCount = new HashMap<String,Integer>(); application.setAttribute("ipCount",ipCount); this.filterConfig = filterConfig; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub ServletContext application = filterConfig.getServletContext(); Map<String,Integer> ipCount = (HashMap<String,Integer>)application.getAttribute("ipCount"); String ip = request.getRemoteAddr(); Integer count = ipCount.get(ip); if(count != null){ //Map中存在該ip count = count + 1; }else{ count = 1; } ipCount.put(ip, count); application.setAttribute("ipCount",ipCount); chain.doFilter(request, response); } @Override public void destroy() { // TODO Auto-generated method stub }}


filter菜鳥教程


以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“filter菜鳥教程的詳細(xì)講解”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 妞干在线 | 久久精品a亚洲国产v高清不卡 | 最近中文视频高清 | 久久99精品麻豆国产 | 女性污污18污污 | 欧美a级片在线观看 | 77se77亚洲欧美在线大屁股 | 国产亚洲精品精品国产亚洲综合 | 性a爱片免费视频性 | 欧美成人精品一区二区 | 乱色美www女麻豆 | 在线观看欧洲成人免费视频 | 日本黄色三级网站 | 男人天堂色| 黄在线免费 | 成人黄色三级视频 | 中文字幕一区二区三区永久 | 亚洲福利视频一区二区 | 欧美日韩高清在线观看一区二区 | 天天插伊人 | 韩国成人理伦片免费播放 | 色噜噜狠狠色综合中国 | 久久久久夜色精品波多野结衣 | 久久久久久久九九九九 | 欧美性猛交xxxx免费看手交 | 怡红院日本一道日本久久 | 欧美人成网站免费大全 | 亚洲超大尺度激情啪啪人体 | 午夜欧美 | 免费看美女毛片 | 亚洲欧美久久婷婷爱综合一区天堂 | 韩国伦理片免费在线观看 | 日日狠狠| 亚洲欧美一区二区三区综合 | 小雪婷的性欢日记h全文 | 欧美亚洲色图视频 | 最近免费字幕中文大全视频 | 亚洲欧美日本综合一区二区三区 | 最刺激黄a大片免费网站 | 国内在线精品 | 午夜视频免费观看黄 |