Filter介紹

Filter 可認為是 Servlet的一種 “ 加強版 ”,它主要用于對用戶請求進行預處理, 也可以對HttpServletResponse 進行后處理,是個典型的處理鏈。Filter 也可對用戶請求生成響應,這一 點與Servlet 相同, 但實際上很少會使用Filter向用戶請求生成晌應。 使用Filter完整的流程是:Filter對用戶請求進行預處理, 接著將請求交給Servlet 進行處理并生成響應, 最后Filter再對服務器響應進行后處理。

Filter有如下幾個用處。
》在HttpServletRequest到達Servlet之前, 攔截客戶的HttpServletRequest。
》根據需要檢查HttpServletRequest, 也可以修改HttpServletRequest頭和數據。
》在HttpServletResponse到達客戶端之前, 攔截HttpServletResponse。
》根據需要檢查HttpServletResponse, 也可以修改HttpServletResponse頭和數據。
Filter有如下幾個種類。
》用戶授權的Filter: Filter負責檢查用戶請求, 根據請求過濾用戶非法請求。

〉日志Filter: 詳細記錄某些特殊的用戶請求。
》負責解碼的Filter: 包括對非標準編碼的請求解碼。
〉能改變XML內容的XSLTFilter等。
》Filter可負責攔截多個請求或響應;一個請求或響應也可被多個Filter攔截。

創建Filter只需兩個步驟:

  1、創建Filter處理類

  2、web.xml中配置Filter

1、創建Filter處理類

創建 Filter 必須實現 javax.servlet.Filter 接口, 在該接口中定義了如下三個方法。
》 void init ( FilterConfig config ): 用于完成 Filter 的初始化。
》 void destroy(): 用于 Filter 銷毀前, 完成某些資源的回收。
》 void doFilter CServletRequest request, ServletResponse response,FilterChain chain ):實現過濾功能,

?

下面介紹一個日志 Filter, 這個 Filter 負責攔截所有的用戶請求, 并將請求的信息記錄在日志中:

package servlet;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;@WebFilter(filterName="log",urlPatterns="/*")
public class LogFilter implements Filter{@Overridepublic void destroy() {System.out.println("執行filter的destroy方法");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("執行filter的doFilter方法");HttpServletRequest hrequest = (HttpServletRequest) request;System.out.println("用戶請求的地址為:"+hrequest.getServletPath());chain.doFilter(request, response);}@Overridepublic void init(FilterConfig config) throws ServletException {System.out.println("執行filter的init方法");}}

2、配置Filter

前面已經提到, Filter 可以認為是 Servlet 的 “ 增強版”,因此配置 Filter 與配置 Servlet 非常相似,都需要配置如下兩個部分。

》配置 Filter 名。
》配置 Filter 攔截 URL 模式。
區別在于: Serviet 通常只配置一個 URL,而Filter 可以同時攔截多個請求的 URL。因此, 在配置Filter 的 URL 模式時通常會使用模式字符串, 使得 Filter 可以攔截多個請求。 與配置 Serviet 相似的是, 配置 Filter 同樣有兩種方式。

》在 Filter 類中通過注解進行配置。
》在 web.xml 文件中通過配置文件進行配置。
上面 Filter 類的粗體字代碼使用@Webfilter 配置該 Filter 的名字為 log,它會攔截向/*發送的所有的請求。

@Webfilter 修飾一個 Filter 類, 用于對 Filter 進行配置, 它支持如下圖所示的常用屬性

在 web.xml 文件中配置 Filter 與配置 Serviet 非常相似,需要為 Filter 指定它所過濾的 URL,并且也 可以為 Filter 配置參數。

 <filter><filter-name>log</filter-name><filter-class>servlet.LogFilter</filter-class></filter><filter-mapping><filter-name>log</filter-name><url-pattern>/*</url-pattern></filter-mapping>

Filter的作用:

?

3、使用URL Rewrite實現網站偽靜態

?

xxx.jsp?param=value ...
大部分搜索引擎都會優先考慮收錄靜態的HTML頁面,而不是這種動態的*.jsp、*.php頁面。但實
際上絕大部分網站都是動態的,不可能全部是靜態的HTML頁面,因此互聯網上的大部分網站都會與
慮使用偽靜態一一就是將飛jsp、*.php 這種動態U虹偽裝成靜態的HTML頁面。
對于JavaWeb應用來說,要實現偽靜態非常簡單:可以通過Filter攔截所有發向*.html請求,然1;;
按某種規則將請求forward到實際的*.jsp頁面即可。現有的URL Rewrite開源項目為這種思路提供了實
現,使用URL Rewrite實現網站偽靜態也很簡單。
下面詳細介紹如何利用URL Rewrite實現網站偽靜態。
登錄http://www.tuckey.org/urlrewrite/站點下載Uri Rewrite 的最新版本,本書成書時,該項目的
最新版本是4.0.3,建議讀者也下載該版本的Uri Rewrite。

下載URL Rewrite,直接下載它的urlrewritefilter-4.0.3.jar即可,并將該JAR包復制到Web應用
的WEB-INF\lib目錄下。
在web.xml文件中配置啟用URL Rewrite Filter,在web.xml文件中增加如下配置片段。

<filter><filter-name>UrlRewriteFilter</filter-name><filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class></filter><filter-mapping><filter-name>UrlRewriteFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

上面的配置片段指定使用URL Rewrite Filter攔截所有的用戶請求。

在應用的WEB-INF 路徑下增加urlrewrite.xml文忡,該文件定義了偽靜態l映射規則,這份偽靜態規則是基于正則表達式的。

下面是本應用所使用的urlrewrite.xml 偽靜態規則文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" "http://tuckey.org/res/dtds/urlrewrite3.2.dtd"><urlrewrite><rule><from>/userinf-(\w+).html</from><to type="forward">/userinf.jsp?username=$1</to></rule></urlrewrite>

上面的規則文件中只定義了一個簡單的規則:所有發向/userinf-(\w*).html的請求都將被forward 到
userinfjsp 頁面, 并將(\w*)正則表達式所匹配的內容作為usemame 參數值。根據這個偽靜態規則, 需要為
該應用提供一個userinf.jsp 頁面,

?

轉載于:https://www.cnblogs.com/lidian/p/8918740.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode算法題-Jewels and Stones(Java實現)

這是悅樂書的第313次更新&#xff0c;第334篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第182題&#xff08;順位題號是771&#xff09;。字符串J代表珠寶&#xff0c;S代表你擁有的石頭。S中的每個字符都是你擁有的一種石頭。計算S中有多少石頭也是珠寶。J中…

python --- 二分查找算法

二分查找法&#xff1a;在我的理解中這個查找方法為什么會叫二分呢&#xff0c;我認為是將要查詢的一個列表分成了兩份&#xff0c;然后在利用某個值來進行比較&#xff0c;在一個不斷循環的過程中來找出我們要找的某一個值。 廢話不多說&#xff0c;先上代碼&#xff1a; 1 de…

面試題

1. block 的作用由來&#xff0c;跟delegate的區別。 2. swift 的枚舉。 3. iOS保存一個對象。轉載于:https://www.cnblogs.com/studyNT/p/7499779.html

ssm框架下文件上傳

springmvc實現文件上傳的步驟&#xff1a; 1.頁面上&#xff0c;通過input來準備file組件&#xff0c;該標簽&#xff0c;必須給定name屬性值 同時&#xff0c;要求form表單必須給定一個屬性&#xff1a;enctype"multipart/form-data" 2.在pom.xml文件中&#xff0c;…

MySQL via EF6 的試用報告

MySQL via EF6 的試用報告1、如何通過 EF6 來連接 MySQL&#xff1f;2、如何通過 EF6 來實現 CRUD&#xff1f;2.1、Create 添加2.2、Retrieve 查詢2.3、Update 修改2.4、Delete 刪除3、如何更好的運用 EF6 來完成工作&#xff1f;3.1、傳說中 EF 的三種模式3.2、EF6 執行原生 …

Java暑假作業

一.《大護法》觀影有感 ... 從預告開始就期待著這部影片&#xff0c;在看過一遍后又忍不住二刷&#xff0c;影片觀看至第二遍后&#xff0c;對于全片的脈絡也更清晰了一點&#xff0c;雖然打著暴力美學的旗子&#xff0c;但《大護法》偏偏更文藝一些。文藝片是沒有對錯的&a…

使用EasyNetQ組件操作RabbitMQ消息隊列服務

RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue)的開源實現&#xff0c;是實現消息隊列應用的一個中間件&#xff0c;消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合&#xff0c;異步消息&#xff0c;流量削鋒等問題。實現高性能&#xff0c;…

context-param和init-param的區別

http://www.cnblogs.com/hzj-/articles/1689836.html 轉載于:https://www.cnblogs.com/wangc04/p/7501054.html

TensorFlow 1.12.2 發布,修復 GIF 構造安全漏洞

開發四年只會寫業務代碼&#xff0c;分布式高并發都不會還做程序員&#xff1f; TensorFlow 1.12.2 發布了&#xff0c;此處本修復了一個潛在的安全漏洞&#xff1a; 精心設計的 GIF 圖像可以在解碼過程中產生空指針解引用更新說明&#xff1a; https://github.com/tensorflo…

【教程】如何在標簽打印工具TFORMer Designer中自定義布局?

TEC-IT的在線標簽生成器TFORMer Designer提供標簽打印服務&#xff0c;并提供即用型行業標簽模板作為Web服務。使用此軟件&#xff0c;您可以在幾秒鐘內創建您自己的標簽和表格或在工業和物流業中使用即時可用的模板。TFORMer Designer的最新更新現在允許使用自定義標簽布局。 …

對象變為指定格式的數組

拿到的對象的格式&#xff08;一個對象里面都好多屬性&#xff09; 想要轉換成的數據格式&#xff08;一個數組里面有好多個對象&#xff0c;每個對象有一個id和name的屬性&#xff09; 如何處理的 selectionChange(val) { // 列表選擇var dynamicTags1 [];var arr[]for(var i…

bootstrapValidator remote 驗證問題

1 加載jQuery和bootstrap.min.js 后引入bootstrapValidator.min.js字段驗證之remote 遠程驗證(類似ajax驗證)&#xff0c;返回值必須是 {"valid":true}{"valid":false} true表示 驗證通過 false 表示驗證不通過。 當添加remote 驗證后&#xff0c;驗證通過…

世界頂級的程序員們告訴你:這些書都是你應該讀的

在很早之前就想整理一份來自經驗豐富的頂級程序員推薦閱讀的書籍清單&#xff0c;全棧工程師Dmitry Shvetsov整理了Bob叔以及Jeff Atwood and DHH等世界知名程序員曾經在博客中推薦過的書單&#xff0c;下面我們就一起來看看深受大神們青睞的書籍都是哪些?世界頂級的程序員們告…

《20170911-構建之法:現代軟件工程-閱讀筆記》

第一章&#xff1a; 介紹軟件工程和軟件的關系&#xff0c;軟件程序軟件工程。 軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。 計算機科學這一學術領域可以分為以下這些偏理論的領域&#xff1a; 1.計算機理論 2.信息和編碼理論 3.算法和數…

mysql學習(2)索引的本質

2019獨角獸企業重金招聘Python工程師標準>>> 問題&#xff1a;SQL查詢慢怎么辦&#xff1f; 優化手段&#xff0c;加索引。 索引是幫助MYSQL高效的獲取數據的排好序的數據結構。 問題&#xff1a;索引結構為什么使用Btree而不使用二叉樹&#xff0c;紅黑樹或者HASH結…

bzoj4245: [ONTAK2015]OR-XOR

一道很有意思的題目。 先求一次前綴和&#xff0c;可以發現答案是 (sum[0] xor sum[x1])or(sum[x1] xor sum[x2])or(sum[x2] xor sum[x3])or……or(sum[m-1] xor sum[n]) 然后其實&#xff08;a xor b&#xff09;or b a or b 那么sum[0]0,可以把柿子變成 sum[x1] or sum[x2] o…

移動端常見的一些兼容性問題

1、安卓瀏覽器看背景圖片&#xff0c;有些設備會模糊。 是devicePixelRatio作怪&#xff0c;因為手機分辨率太小&#xff0c;如果按照分辨率來顯示網頁&#xff0c;這樣字會非常小&#xff0c;所以蘋果當初就把iPhone 4的960*640分辨率&#xff0c;在網頁里只顯示了480*320&…

go-變量

這次我們學習一下golang語言 gitee: go-study 定義 定義的變量或者函數必須用到(pakeage內的全局除外) var a int // 默認為0 var b string //默認為"" fmt.Printf("%d %q\n",a, s) 復制代碼直接定義可以不寫類型(int..)go會自行判斷 var a, b 3, 4 var …

CSS3:CSS3 文本效果

ylbtech-CSS3&#xff1a;CSS3 文本效果1.返回頂部 1、CSS3 文本效果 CSS3 文本效果 CSS3中包含幾個新的文本特征。 在本章中您將了解以下文本屬性&#xff1a; text-shadowbox-shadowtext-overflowword-wrapword-break瀏覽器支持 屬性 text-shadow4.010.03.54.09.5box-sha…

洛谷 P2296 尋找道路

題目描述 在有向圖G 中&#xff0c;每條邊的長度均為1 &#xff0c;現給定起點和終點&#xff0c;請你在圖中找一條從起點到終點的路徑&#xff0c;該路徑滿足以下條件&#xff1a; 1 &#xff0e;路徑上的所有點的出邊所指向的點都直接或間接與終點連通。 2 &#xff0e;在滿足…