⑧javaWeb之在例子中学习(过滤器Filter)
前言
本系列 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)容,希望文章能夠幫你解決所遇到的問題。