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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 filter菜鳥教程的詳細講解

filter菜鳥教程的詳細講解

更新時間:2020-09-10 14:38:36 來源:動力節點 瀏覽1772次


Filter,過濾器,顧名思義,即是對數據等的過濾,預處理過程。為什么要引入過濾器呢?在平常訪問網站的時候,有時候發一些敏感的信息,發出后顯示時就會將敏感信息用*等字符替代,這就是用過濾器對信息進行了處理。這只是一個簡單的例子,當然,過濾器那么強大,它的功能也不可能局限于此,它不僅能預處理數據,只要是發送過來的請求它都是可以預處理的,同時,它還可以對服務器返回的響應進行預處理,這樣,大大減輕了服務器的壓力。例如,實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。下面來詳細介紹一下過濾器。


一、定義


學習一個東西,我們首先要理解它的定義。


1.概念


過濾作用,對從客戶端向服務器端發送的請求進行過濾,也可以對服務器端返回的響應進行處理。它使用戶可以改變一個request和修改一個response.。Filter不是一個servlet,它不能產生一個response,但是它能夠在一個request到達servlet之前預處理request,也可以在response離開servlet時處理response。換句話說,filter其實是客戶端與servlet中間的一個傳遞者,并且它可以對要傳遞的東西進行修改。


filter菜鳥教程


注意:過濾器是用來攔截請求和響應的,不能產生響應,而servlet是用來處理請求并產生響應的。


2.適用場合


實現URL級別的權限訪問控制,過濾敏感詞匯,壓縮響應信息等。


3.過濾器如何實現攔截


當客戶端發生請求后,在HttpServletRequest到達Servlet之前,過濾器攔截客戶的HttpServletRequest。


根據需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數據。


在過濾器中調用doFilter方法,對請求放行。請求到達Servlet后,對請求進行處理并產生HttpServletResponse發送給客戶端。


在HttpServletResponse到達客戶端之前,過濾器攔截HttpServletResponse。


根據需要檢查HttpServletResponse,可以修改HttpServletResponse頭和數據。


最后,HttpServletResponse到達客戶端。


4.Filter接口


Servlet API提供了一個Filter接口,編寫的過濾器必須實現該接口。


5.Filter的生命周期


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


init()方法:初始化參數,在創建Filter時自動調用。當我們需要設置初始化參數的時候,可以寫到該方法中。


doFilter()方法:攔截到要執行的請求時,doFilter就會執行。這里面寫我們對請求和響應的預處理。


destroy()方法:在銷毀Filter時自動調用。


(2)Filter的生命周期


Filter的創建和銷毀由web服務器控制。


服務器啟動的時候,web服務器創建Filter的實例對象,并調用其init方法,完成對象的初始化功能。filter對象只會創建一次,init方法也只會執行一次。


攔截到請求時,執行doFilter方法。可以執行多次。


服務器關閉時,web服務器銷毀Filter的實例對象。


6.Filter對象——FilterConfig


用戶在配置filter時,可以使用<init-param>為filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得:


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


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


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


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


7.過濾器鏈——FilterChain


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


filter菜鳥教程


二、開發步驟


了解了過濾器的相關概念,接下來進行實例開發。


1.編寫步驟


編寫java類實現Filter接口,并實現其doFilter方法。


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


2.示例


(1)簡單的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{ /* * 對Filter的整個生命周期了解的一個案例 * 注意事項: * 1.實現Filter接口時導入的是javax.servlet.Filter包 * 2.方法均有web服務器自動調用,不需我們手動調用 * 3.init方法中一般寫初始化參數,這里先不用,后面的例子再使用。 * 4.destroy方法一般不需要寫任何代碼 * 5.重寫doFilter方法,可以寫我們對攔截的請求和響應的處理動作。 * 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方法被調用"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("我是FilterDemo1,客戶端向Servlet發送的請求被我攔截到了"); chain.doFilter(request, response); System.out.println("我是FilterDemo1,Servlet向客戶端發送的響應被我攔截到了"); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("FilterDemo1的destroy方法被調用"); }}


配置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> <!-- /*是對所有的文件進行攔截 --> </filter-mapping>


控制臺結果


filter菜鳥教程


分析:從上面結果可以看出,在服務器啟動時,就調用了init方法,當訪問頁面時,該過濾器攔截到請求執行doFilter方法,在該方法中,使用doFilter方法,當返回響應后,繼續執行剩下的代碼,執行完成后將響應傳給客戶端。當關閉服務器時,服務器就調用了destroy方法。


(2)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{ /* * @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發送的請求被我攔截到了"); //對請求放行,進入下一個過濾器FilterDemo2 chain.doFilter(request, response); System.out.println("我是FilterDemo1,Servlet向客戶端發送的響應被我攔截到了"); } @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發送的請求被我攔截到了"); //對請求放行,進入Servlet chain.doFilter(request, response); System.out.println("我是FilterDemo2,Servlet向客戶端發送的響應被我攔截到了"); } @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> <!-- /*是對所有的文件進行攔截 --> </filter-mapping> <filter-mapping> <filter-name>filterDemo2</filter-name> <url-pattern>/*</url-pattern> <!-- /*是對所有的文件進行攔截 --> </filter-mapping>


控制臺結果


filter菜鳥教程


分 析:當有多個過濾器對同一個請求進行攔截時,根據web.xml文件中<filter-mapping>的配置順序,誰在前,先執行誰。當第 一過濾器攔截成功后,會執行doFilter方法,該方法中,調用chain.doFilter方法,會將該請求放行給下一個過濾器,依次執行,直到執行 到最后一個過濾器,當最后一個過濾器調用chain.doFilter方法時,請求會被放行給Servlet,當Servlet處理返回響應信息時,先返 回到最后執行的過濾器,繼續執行該過濾器剩下的代碼。依次返回,直到返回到第一個過濾器,最后返回給客戶端。


(3)禁用所有動態頁面的緩存過濾器


編寫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的頭部設置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統計網站的訪問次數過濾器


編寫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 //初始化參數,ipCount用來存放ip及訪問次數 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菜鳥教程


以上就是動力節點java培訓機構的小編針對“filter菜鳥教程的詳細講解”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 久久久午夜影院 | 狠狠操网址 | 日本a视频在线 | 国产福利微拍精品一区二区 | 国产99在线播放免费 | 亚洲一级大黄大色毛片 | 日韩色视频一区二区三区亚洲 | 一二三四在线视频播放社区 | 在线观看视频日韩 | 久久精品一区二区三区日韩 | 成人国产永久福利看片 | 欧美日本成人 | 国产成人免费观看在线视频 | 午夜影院网站 | 中文字幕在线免费播放 | 一本加勒比dvd波多野结衣 | 成人精品视频一区二区三区尤物 | 免费h片在线观看 | 伊人五月天婷婷 | 91短视频在线高清hd | 亚州 色 图 综合 | 国产hd | 一级做a爰片性色毛片视频图片 | 亚洲国产中文字幕在线观看 | 国产综合色在线视频区色吧图片 | 亚洲精品无码专区在线播放 | 香蕉视频污片 | 天天看天天爽天天摸天天添 | 男女在线视频观看 | 亚洲天天做日日做天天看 | 在线黄色观看 | 日韩性视频网站 | 狠狠色丁香婷婷综合精品视频 | 国产日韩精品欧美一区视频 | 黄色一级片欧美 | 成人h视频 | 久久久久18 | 中文字幕在线观看第一页 | 国产性xxx| 在线看黄网| 国产日韩欧美精品 |