日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

⑧javaWeb之在例子中学习(过滤器Filter)

發(fā)布時(shí)間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ⑧javaWeb之在例子中学习(过滤器Filter) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

  本系列 Servlet & JSP 學(xué)習(xí)系列[傳送門]逐漸到了中期了,希望大家喜歡我寫的,總結(jié)的點(diǎn)點(diǎn)滴滴-

    今天我們來講講過濾器

  你們的支持是我寫博客的動(dòng)力哦。

  最近買了兩本書,覺得大二了。每個(gè)月的零花錢中買幾本書,一年也能買二三十本。不亦樂乎!分享下

?

? ? ?   ? ? ??

      雖然看不懂,先看吧。至少不虧,以后溫故知新.

Fitler(過濾器)

  過濾器filter是攔截請(qǐng)求,并對(duì)傳給請(qǐng)求資源的ServletRequest 或 ServletResponse 進(jìn)行處理的一個(gè)對(duì)象。可以用于登錄,加密和解密,會(huì)話檢查,圖片轉(zhuǎn)換等等

?

  過濾器執(zhí)行機(jī)制圖:

      

   

  Filter API :?http://docs.oracle.com/javase/6/docs/api/

Filter詳解

  Filter接口的構(gòu)成:

?????   所有的Filter類都必須實(shí)現(xiàn)javax.servlet.Filter接口。這個(gè)接口含有3個(gè)過濾器類必須實(shí)現(xiàn)的方法:

?

??????  ? ①init(FilterConfig):這是Filter的初始化方法,Servlet容器創(chuàng)建Filter實(shí)例后將調(diào)用這個(gè)方法。在這個(gè)方法中可以讀取web.xml文件中Filter的初始化參數(shù)


???????  ?②doFilter(ServletRequest,ServletResponse,FilterChain):?這個(gè)方法完成實(shí)際的過濾操作,當(dāng)客戶請(qǐng)求訪問于Filter關(guān)聯(lián)的URL時(shí),Servlet容器將先調(diào)用Filter的doFilter方法。FilterChain參數(shù)用于訪問后續(xù)Filters

?????  ? ?③destroy():? Servlet容器在銷毀Filter實(shí)例前調(diào)用該方法,這個(gè)方法中可以釋放Filter占用的資源

?

? ? ? ?配置Filter(下面例子用的是注釋配置)

?

<filter> <filter-name>enconfigFilter</filter-name> <filter-class>com.filter.EnconfigFilter</filter-class> <init-param> <param-name>enconfig</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>enconfigFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

?

?

? ? ? ?其中: ??

??????? filter-name?? 指定過濾器的名字
??????? filter-class????指定過濾器的類名
??????? init-param????為過濾器實(shí)例提供初始化參數(shù),可以有多個(gè)
??????? url-pattern?? 指定和過濾器關(guān)聯(lián)的URL,為”/*”表示所有URL

?

圖片保護(hù)過濾器

  咱們用ImageProtetorFilter來保護(hù)咱們的圖片,防止地址欄中直接輸入圖片URL 來下載圖片。

?

  小小的原理:

    過濾器通過查看HTTP 標(biāo)頭的referer的值進(jìn)行工作。值為空表示當(dāng)前請(qǐng)求沒有相當(dāng)?shù)囊庙摗6禐榭?#xff0c;說明請(qǐng)求在引用頁,自然圖片在jsp里面供認(rèn)看與下載。

  

  小朽嘗試:

    ①包結(jié)構(gòu)

      

    ② ImageProtector類

      doFilter實(shí)現(xiàn)了,獲取標(biāo)頭→判斷→然后拋異常

    

package sedion.jeffli.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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest;/*** * @author Jeff Li**/ @WebFilter(filterName = "ImageProtetorFilter",urlPatterns={"*.png","*.jpg","*.gif"}) public class ImageProtector implements Filter{@Overridepublic void destroy() {// TODO Auto-generated method stub }@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("ImageProtetorFilter");HttpServletRequest httpServletR = (HttpServletRequest)request;String referrer = httpServletR.getHeader("referer");System.out.println("referrer:"+referrer);if(referrer != null){chain.doFilter(request, response);}else{throw new ServletException("Image not available");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub }}

    

    ③JSP 頁面加入

<img alt="logo" src="logo.jpg">

?

  小朽看效果說話:

    ①當(dāng)直接在火狐中,打開url:http://localhost:8080/filterTest/logo.jpg

      頁面出現(xiàn)了?HTTP Status 500 - Image not available

      打開小蜜蜂(firebug),查看網(wǎng)絡(luò),發(fā)現(xiàn)沒有referer請(qǐng)求頭信息

    ②當(dāng)直接在火狐中,打開url:http://localhost:8080/filterTest/index.jsp

      頁面自然出現(xiàn)了圖片。

      打開小蜜蜂(firebug),查看網(wǎng)絡(luò)

        

?

下載過濾器

  顧名思義,計(jì)算某個(gè)資源下載了多少次,或知道某些東石受歡迎程度。自然這個(gè)必不可少。

  Question and Solving:

    我們將值保存在一個(gè)屬性文件中,并且多個(gè)線程可以同時(shí)訪問一個(gè)過濾器,因此就有一個(gè)線程安全性的問題需要解決。用戶請(qǐng)求資源讀取相應(yīng)屬性值,將它贈(zèng)一個(gè)并存回新值。如果第一個(gè)線程完成任務(wù)前,又有第二個(gè)用戶請(qǐng)求同一個(gè)資源,怎么辦?同步讀寫值的代碼似乎不是個(gè)好方法,涉及到擴(kuò)展性的問題。

    我們利用Queue 和 Executor 解決這個(gè)線程的問題。所有進(jìn)來的請(qǐng)求都在一個(gè)線程Executor隊(duì)列中放置一項(xiàng)任務(wù)。放置任務(wù)比較快,因?yàn)檫@是一個(gè)異步的操作。由于只有使用一個(gè)Executor一個(gè)線程,因此消除了多線程訪問該屬性文件的可能。

  

  小朽嘗試:

    就加個(gè)DownloadCounterFilter,啟動(dòng)就好。

package sedion.jeffli.filter;import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; /*** * @author Jeff Li**/@WebFilter(filterName="DownloadCounterFilter",urlPatterns={"/*"}) public class DownloadCounterFilter implements Filter{ExecutorService executorService = Executors.newSingleThreadExecutor();Properties downloadLog;File logFile;@Overridepublic void destroy() {executorService.shutdown();}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) request;final String uri = httpServletRequest.getRequestURI();executorService.execute(new Runnable() {@Overridepublic void run() {String property = downloadLog.getProperty(uri);if(property == null){downloadLog.setProperty(uri, "1");}else{int count = 0;try {count = Integer.parseInt(property);} catch (NumberFormatException e) {}count++;downloadLog.setProperty(uri, Integer.toString(count));}try {downloadLog.store(new FileWriter(logFile), "");} catch (Exception e) {}}});chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("DownloadCounterFilter");String appPath = filterConfig.getServletContext().getRealPath("/");logFile = new File(appPath,"downloadLog.txt");if(!logFile.exists()){try {logFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}downloadLog = new Properties();try {downloadLog.load(new FileReader(logFile));} catch (IOException e) {e.printStackTrace();}}}

    

  小朽分析下:

  

String appPath = filterConfig.getServletContext().getRealPath("/");logFile = new File(appPath,"downloadLog.txt");if(!logFile.exists()){try {logFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}

   項(xiàng)目路徑下:tomcat_dir/filterTest/ 如果沒有文件downloadLog.txt,初始化生成。當(dāng)訪問項(xiàng)目有關(guān)文件,則會(huì)記錄到這個(gè)property文件中。

   

    小朽看效果:

    打開tomcat_dir/filterTest/downloadLog.txt

# #Thu Mar 20 12:39:02 CST 2014 /filterTest/logo.jpg=3 /filterTest/=1 /filterTest/index.jsp=2

  

    

  

總結(jié)?

  

 寄讀者,寄知識(shí)來源

   讀者,你好!你我不相識(shí),謝謝你們支持。只有記錄點(diǎn)滴,我的夢(mèng)想會(huì)越來越接近。共勉!

   知識(shí)來源 http://book.douban.com/doulist/3575997/

            

轉(zhuǎn)載于:https://www.cnblogs.com/Alandre/p/3613457.html

總結(jié)

以上是生活随笔為你收集整理的⑧javaWeb之在例子中学习(过滤器Filter)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。