真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

filter過(guò)濾器怎么在Java項(xiàng)目中使用-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)filter過(guò)濾器怎么在Java項(xiàng)目中使用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的夷陵網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Filter過(guò)濾器技術(shù)。通過(guò)過(guò)濾器,可以對(duì)來(lái)自客戶(hù)端的請(qǐng)求進(jìn)行攔截,進(jìn)行預(yù)處理或者對(duì)最終響應(yīng)給客戶(hù)端的數(shù)據(jù)進(jìn)行處理后再輸出。

要想使用Filter過(guò)濾器,非常簡(jiǎn)單,只要實(shí)現(xiàn)Servlet  API中的Filter接口即可,同時(shí)在該web應(yīng)用【W(wǎng)EB-INF】目錄下的web.xml文件中配置兩個(gè)標(biāo)簽。其中可以根據(jù)配置指定過(guò)濾的頁(yè)面或者Servlet。

也就是說(shuō)我們?cè)趙eb工程中光光寫(xiě)Filter過(guò)濾器的Java代碼是不會(huì)起作用的,要在web.xml文件中對(duì)過(guò)濾器進(jìn)行注冊(cè)和映射,在學(xué)習(xí)Filter之前我們先來(lái)學(xué)習(xí)如何注冊(cè)和映射
關(guān)于注冊(cè):

需要在web.xml文件中配置標(biāo)簽,這還不夠,標(biāo)簽下的是必須要填的內(nèi)容。

標(biāo)簽中有如下子元素:

  1. 用于描述該標(biāo)簽,非必須;

  2. 為過(guò)濾器指定一個(gè)名稱(chēng),必須的

  3. 指定該過(guò)濾器使用的web工程中的哪一個(gè)filter類(lèi),包含包名與類(lèi)名,必須的;

  4. 為過(guò)濾器的初始化提供參數(shù),非必須,后面有例子。

關(guān)于映射:

需要在web.xml文件中配置標(biāo)簽,這還不夠,標(biāo)簽下的以及之一是必須的。

標(biāo)簽中有如下子元素:

  1. 設(shè)置要映射過(guò)濾器的名稱(chēng),該名稱(chēng)必須同標(biāo)簽下的的值一致。

  2. 設(shè)置過(guò)濾器要攔截過(guò)濾的請(qǐng)求路徑,例如“/*”則表示對(duì)該web應(yīng)用下所有的請(qǐng)求都進(jìn)行攔截過(guò)濾。

  3. 如果只要攔截過(guò)濾訪問(wèn)某個(gè)Servlet,就可以使用該標(biāo)簽來(lái)替代。

  4. 設(shè)置攔截過(guò)濾客戶(hù)端請(qǐng)求的方式,有REQUEST,INCLUDE,F(xiàn)ORWARD,ERROR四種(請(qǐng)注意均為大寫(xiě))。非必須則默認(rèn)為REQUEST,使用多個(gè)標(biāo)簽來(lái)設(shè)置多種請(qǐng)求方式。

關(guān)于的四種方式,這里再簡(jiǎn)單的介紹一下:

  1. REQUEST:當(dāng)用戶(hù)直接訪問(wèn)我們的資源時(shí),這時(shí)我們?cè)O(shè)置的過(guò)濾器就會(huì)進(jìn)行攔截。但如果以轉(zhuǎn)發(fā)和包含方式訪問(wèn)資源,那么該過(guò)濾器則不會(huì)被調(diào)用。

  2. INCLUDE:當(dāng)使用RequestDispatch的include方法請(qǐng)求時(shí),該過(guò)濾器會(huì)被調(diào)用。

  3. FORWARD:當(dāng)使用RequestDispatch的forward方法時(shí)請(qǐng)求資源時(shí),該過(guò)濾器會(huì)被調(diào)用,尤其是在MVC設(shè)計(jì)模式下,JSP都被保護(hù)起來(lái),必須要通過(guò)Servlet進(jìn)行轉(zhuǎn)發(fā)才能訪問(wèn)JSP,那么該過(guò)濾器就是在Servlet轉(zhuǎn)發(fā)到JSP這個(gè)過(guò)程中被執(zhí)行。

  4. ERROR:當(dāng)請(qǐng)求是通過(guò)錯(cuò)誤異常進(jìn)行跳轉(zhuǎn)時(shí)就會(huì)調(diào)用該過(guò)濾器。

一個(gè)簡(jiǎn)單的對(duì)過(guò)濾器的注冊(cè)和映射的示例:


  FilterDemo1
  com.bjpowernode.web.filter.FilterDemo1
 
  
 
  FilterDemo1
  /*
  REQUEST
  FORWARD

在Servlet API 中關(guān)于Filter舉例了使用過(guò)濾器能用來(lái)做些什么:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

這里我也說(shuō)明下平時(shí)Filter能在哪些方面會(huì)被經(jīng)常用到:

① Filter可以作用在請(qǐng)求資源執(zhí)行之前,進(jìn)行權(quán)限檢查,檢查用戶(hù)是否有權(quán)限,如有權(quán)限則放行請(qǐng)求;如果沒(méi)有,則拒絕訪問(wèn)。

② Filter可以作用在請(qǐng)求資源執(zhí)行之前,對(duì)Request和Response對(duì)象進(jìn)行預(yù)處理操作,從而實(shí)現(xiàn)一些web應(yīng)用的全局性設(shè)置,比如解決中文亂碼問(wèn)題。

③ Filter可以作用在最終響應(yīng)輸出之前,對(duì)輸出Response對(duì)象中的數(shù)據(jù)進(jìn)行處理,例如將輸出的數(shù)據(jù)進(jìn)行壓縮。

Filter只有3個(gè)方法:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

其中destroy()方法和init(…)方法是生命周期方法,因?yàn)檫^(guò)濾器無(wú)論如何都要在請(qǐng)求任何資源之前進(jìn)行,所以任何Web應(yīng)用在部署的時(shí)候,服務(wù)器就會(huì)調(diào)用Filter過(guò)濾器的init方法進(jìn)行初始化,而關(guān)于過(guò)濾器的銷(xiāo)毀,則是將該過(guò)濾器移除或者服務(wù)器關(guān)閉就會(huì)執(zhí)行destory方法。

而我們通常要使用過(guò)濾器處理請(qǐng)求,則重點(diǎn)在于doFilter(…)方法。當(dāng)請(qǐng)求要經(jīng)過(guò)一個(gè)過(guò)濾器的時(shí)候,就會(huì)由服務(wù)器調(diào)用doFilter方法。

我們先來(lái)看看一個(gè)帶有過(guò)濾器Filter的web應(yīng)用的請(qǐng)求和響應(yīng)流程:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

記?。簭恼?qǐng)求到響應(yīng)這個(gè)流程會(huì)經(jīng)過(guò)Filter對(duì)象兩次!

在doFilter這一個(gè)方法中就可以對(duì)著兩次經(jīng)過(guò)的過(guò)程進(jìn)行處理,那么這里就有一個(gè)問(wèn)題了,如果能通過(guò)過(guò)濾器,那么就到過(guò)濾器后面了,貌似應(yīng)該是執(zhí)行完doFilter方法了,而服務(wù)器的響應(yīng)又經(jīng)過(guò)過(guò)濾器,難道又要執(zhí)行doFilter方法一次?但是這個(gè)方法里面的代碼不是也有處理最開(kāi)始請(qǐng)求的嗎?

這就跟doFilter方法中的第三個(gè)參數(shù)FilterChain有關(guān)了,F(xiàn)ilterChain對(duì)象是過(guò)濾器鏈,這個(gè)我們稍后會(huì)介紹。在FilterChain對(duì)象中只有一個(gè)方法:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

=也是叫doFilter方法(千萬(wàn)別和Filter接口的doFilter方法弄混了)。簡(jiǎn)單的說(shuō)下這個(gè)方法,只要調(diào)用了這個(gè)方法,就會(huì)將請(qǐng)求交給后面一個(gè)Filter進(jìn)行過(guò)濾(一個(gè)Web應(yīng)用中可以有多個(gè)Filter),如果該Filter是最后一個(gè),那么調(diào)用該方法則將執(zhí)行請(qǐng)求,也就是到我們的應(yīng)用中獲取資源。

因此從請(qǐng)求到響應(yīng)這個(gè)流程經(jīng)過(guò)Filter的兩次處理分別是在FilterChain.doFilter方法的前面和后面!如下圖所示:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

那么下面我們就先以一個(gè)簡(jiǎn)單的例子來(lái)熟悉下Filter吧:

例1:

創(chuàng)建web工程FilterLearning,創(chuàng)建一個(gè)FilterDemo1類(lèi),同時(shí)這個(gè)類(lèi)要實(shí)現(xiàn)javax.servlet.Filter接口。如下代碼:

public class FilterDemo implements Filter {
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     
     System.out.println("hello filter");
   }
 
   //此處省略init方法和destory方法
 }

寫(xiě)好Filter的Java代碼還沒(méi)完,還要在web應(yīng)用下的web.xml文件中配置如下信息:

 
    FilterDemo1
    com.bjpowernode.web.filter.FilterDemo
  
  
  
    FilterDemo1
    /*
 

注意:因?yàn)槲以?url-pattern>中配置為“/*”,則訪問(wèn)我wen應(yīng)用中任何資源都會(huì)經(jīng)過(guò)該Filter過(guò)濾器。如果只想對(duì)于index.jsp主頁(yè)的請(qǐng)求進(jìn)行過(guò)濾,可以設(shè)為/index.jsp。

我們?cè)趇ndex.jsp中簡(jiǎn)單的使用JSP腳本來(lái)演示如果有請(qǐng)求來(lái)就輸入一段文本到控制臺(tái)上:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 
 
 
    
   index
  
  
  
   <%
     System.out.println("Long live SD !");
   %>
  
 

接下來(lái)將該web應(yīng)用部署到服務(wù)器中,我們就訪問(wèn)index.jsp,以下是我們?cè)L問(wèn)了index.jsp后控制臺(tái)的情況:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

首先,我們可以保證在我們?cè)L問(wèn)index.jsp后這個(gè)請(qǐng)求確實(shí)經(jīng)過(guò)了Filter過(guò)濾器,但是我們的請(qǐng)求好像就只到過(guò)濾器而沒(méi)有到我們真正需要的資源index.jsp?這是因?yàn)槲覀儧](méi)有在Filter的doFilter方法中調(diào)用過(guò)濾器鏈FilterChain對(duì)象的doFilter方法,自然無(wú)法將請(qǐng)求繼續(xù)往后面?zhèn)鬟f。我們將在例2中修改。

例2:

我們將例1中的FilterDemo1類(lèi)進(jìn)行修改,使其能訪問(wèn)到我們所需要的資源,很簡(jiǎn)單,在doFilter的方法中添加過(guò)濾器鏈FilterChain對(duì)象的doFilter方法即可:

public class FilterDemo implements Filter {
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     
     System.out.println("hello filter");
     chain.doFilter(request, response);
   }
   //此處省略init方法和destory方法
 }

其他如web.xml中的配置和index.jsp中的代碼保持不變,現(xiàn)在我們?cè)賮?lái)訪問(wèn)下該web應(yīng)用中的index.jsp,并觀察控制臺(tái):

filter過(guò)濾器怎么在Java項(xiàng)目中使用

可以看到我們的請(qǐng)求經(jīng)過(guò)過(guò)濾器,執(zhí)行了過(guò)濾器的一段代碼(System.out.println(“hello filter”)),然后將請(qǐng)求繼續(xù)執(zhí)行!正是因?yàn)镕ilterChain.doFilter方法才使我們通過(guò)過(guò)濾器繼續(xù)向后尋找我們所需的資源。

那么還記得我們之前說(shuō)過(guò)的從請(qǐng)求到響應(yīng)會(huì)經(jīng)過(guò)兩次過(guò)濾器嗎,是的在獲取了我們所需的資源后還會(huì)到過(guò)濾器一趟,而至于這時(shí)候是否將響應(yīng)再做處理取決于過(guò)濾器鏈FilterChain.doFilter方法后面還是否有代碼。我們將在例3中完整的展現(xiàn)從請(qǐng)求到響應(yīng)經(jīng)過(guò)過(guò)濾器兩次的流程。

例3:

我們將例2中的FilterDemo1類(lèi)進(jìn)行修改,只要在FilterChain.doFilter方法后面添加代碼,就是第二次(即響應(yīng))經(jīng)過(guò)過(guò)濾器所要執(zhí)行的處理:

public class FilterDemo implements Filter {
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     
     System.out.println("hello filter");
     chain.doFilter(request, response);
     System.out.println("goodbye filter");
   }
   //此處省略init方法和destory方法
 }

其他如web.xml中的配置和index.jsp中的代碼保持不變,現(xiàn)在我們?cè)賮?lái)訪問(wèn)下該web應(yīng)用中的index.jsp,并觀察控制臺(tái):

filter過(guò)濾器怎么在Java項(xiàng)目中使用

這個(gè)結(jié)果證明了從請(qǐng)求到響應(yīng)確實(shí)經(jīng)過(guò)過(guò)濾器兩次,同時(shí)也說(shuō)明了在Filter的doFilter方法中“過(guò)濾——取資源——再過(guò)濾”執(zhí)行的順序。

現(xiàn)在我們?cè)倩氐紽ilter接口的init方法,我們可以看到在這個(gè)方法內(nèi)有一個(gè)參數(shù)FilterConfig,這個(gè)是由服務(wù)器傳給我們的對(duì)象。如果我們?cè)趙eb.xml文件中配置了過(guò)濾器的初始化參數(shù),就可以通過(guò)該FilterConfig對(duì)象來(lái)在代碼中獲取使用。

這個(gè)過(guò)濾器參數(shù)的初始化配置可以在標(biāo)簽中配置,并在這個(gè)標(biāo)簽下再配置

FilterConfig有如下方法:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

當(dāng)然如果我們是要獲取配置的初始化參數(shù)則只需關(guān)注getInitParameter方法或getInitParameterNames方法。

一般來(lái)說(shuō)我們可以在init方法中獲取配置初始化參數(shù)并進(jìn)行處理;也可以通過(guò)對(duì)象引用將FilterConfig對(duì)象在doFilter方法中處理參數(shù),如例4所示。

例4:

在web.xml文件中配置過(guò)濾器和初始化參數(shù):

 
    FilterDemo1
   com.bjpowernode.web.filter.FilterDemo1
    
      Love
      LRR
    
  
  
  
    FilterDemo1
    /*
 

在Java中編寫(xiě)Filter接口的實(shí)現(xiàn)類(lèi)FilterDemo1:

public class FilterDemo implements Filter {
   private FilterConfig filterConfig ;
   
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     
     String value = filterConfig.getInitParameter("Love");
     System.out.println(value);
   }
   
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
     this.filterConfig = filterConfig;
   }
   //此處省略destroy方法
 }

因?yàn)榕渲玫脑?,所以我們隨便訪問(wèn)個(gè)資源都可以經(jīng)過(guò)該過(guò)濾器,那么就訪問(wèn)index.jsp好了,看看控制臺(tái)的結(jié)果:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

正如我們?cè)趙eb.xml文件所配置的初始化參數(shù)一樣。

上面介紹的都是只有一個(gè)Filter過(guò)濾器的情況下,有時(shí)候我們會(huì)因?yàn)橐^(guò)濾的功能不同添加多個(gè)過(guò)濾器,這就有一個(gè)順序的問(wèn)題了,尤其是從取得資源后再返回到過(guò)濾器的順序。下面這張圖就能很清晰的看到我們要注意的順序了:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

例5:

來(lái)寫(xiě)兩個(gè)Filter來(lái)說(shuō)明下從請(qǐng)求到響應(yīng)過(guò)濾器的處理順序。

創(chuàng)建一個(gè)web工程,創(chuàng)建一個(gè)FilterDemo1類(lèi),同時(shí)這個(gè)類(lèi)要實(shí)現(xiàn)javax.servlet.Filter接口。如下代碼:

public class FilterDemo1 implements Filter {
   
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     
     System.out.println("Hello filter 1");
     chain.doFilter(request, response);
     System.out.println("Goodbye filter 1");
   }
 //此處省略init方法和destroy方法
 }

創(chuàng)建第二個(gè)Filter接口實(shí)現(xiàn)類(lèi)FilterDemo2,代碼如下:

 public class FilterDemo2 implements Filter {
 
   public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
     System.out.println("Hello filter 2");
     chain.doFilter(request, response);
     System.out.println("Goodbye filter 2");  
   }
 //此處省略init方法和destroy方法
 }

過(guò)濾器要想能被服務(wù)器調(diào)用,還必須要在該web工程下的web.xml中配置過(guò)濾器及其映射,而這個(gè)配置的順序就是影響多個(gè)過(guò)濾器工作先后的順序:

 
    FilterDemo1
   com.bjpowernode.web.filter.FilterDemo1
 
  
  
    FilterDemo1
    /*
  
  
  
    FilterDemo2
    com.bjpowernode.web.filter.FilterDemo2
  
  
  
    FilterDemo2
    /*
 

而我們要訪問(wèn)的資源文件就以index.jsp為例好了,那么我們用一段JSP腳本通過(guò)在控制臺(tái)打印來(lái)驗(yàn)證過(guò)濾器工作的順序過(guò)程:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 
 
 
    
   index
  
  
  
   <%
     System.out.println("Long live SD !");
   %>
  
 

現(xiàn)在啟動(dòng)服務(wù)器,部署該工程,通過(guò)訪問(wèn)index.jsp來(lái)看看控制臺(tái)情況:

filter過(guò)濾器怎么在Java項(xiàng)目中使用

關(guān)于filter過(guò)濾器怎么在Java項(xiàng)目中使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


當(dāng)前名稱(chēng):filter過(guò)濾器怎么在Java項(xiàng)目中使用-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/csjhcp.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部