servlet——三兄弟的另外兩個:過濾器/監聽器

過濾器

我們寫多了servlet會發現,很多代碼和功能是重復的,比如:解決中文亂碼問題、權限驗證、日志的記錄等,他們的特點是:代碼相同或相似、分散在不同位置、不利于維護。

過濾器就是他們的解決辦法。

過濾器是請求到達目標之前的處理程序,也是響應離開服務器之前的處理程序。

我們可以定義多個過濾器來組成一個過濾器鏈,每個過濾器完成一個任務,請求和響應如圖所示,依次經過過濾器,第一個過濾器最先被經過,離開時最后被經過。

這種設計使用了一個設計模式:責任鏈模式。

一個圖秒懂

如圖,功能類似的代碼只有一份,便于維護。

我們如何使用過濾器呢?

1)開發過濾器類

2)指定過濾器過濾范圍(有些請求不需要經過某些過濾器)

一共也就兩個方法,非常簡單,我們寫一個解決中文亂碼的過濾器吧:

public class EncodingFilter implements Filter{private String encoding;/*** 初始化操作,只執行一次*/@Overridepublic void init(FilterConfig config) throws ServletException {//先讀取配置文件,獲取編碼類型encoding = config.getInitParameter("encoding");if(encoding == null){encoding = "utf-8";}}/*** 相當于Servlet的service(),過濾范圍的每次請求響應都經過*/@Overridepublic void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException {//請求到達目標資源之前的預處理操作request.setCharacterEncoding(encoding);//調用下一個過濾器或者目標資源chain.doFilter(request, response);//響應離開服務器端之前的后處理操作(無)}/*** 銷毀操作,只執行一次*/@Overridepublic void destroy() {// TODO Auto-generated method stub}}

相關配置也和servlet類似(通過kv找到utf-8):

       <filter><filter-name>EncodingFilter</filter-name><filter-class>com.bjsxt.filter.EncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>

我們再理解一下過濾器的執行過程:

代碼中:

? ? ? ? ? ? ? ?//請求到達目標資源之前的預處理操作
? ? ? ? ? ??
? ? ? ? ? ? ? ?//調用下一個過濾器或者目標資源

? ? ? ? ? ? ? ?//響應離開服務器端之前的后處理操作(無)

一共有這么三個操作,而過濾器的執行過程就是如此的

化的很丑但是就是這個意思。

再寫一下怎么搞過濾范圍,也超簡單直接上代碼了:
?

public class AuthFilter implements Filter{@Overridepublic void init(FilterConfig filterconfig) throws ServletException {// TODO Auto-generated method stub}/*** 過濾路徑是  /servlet/*  *.jsp* 某些jsp應該排除在外   * 某些servlet應該排除在外*/@Overridepublic void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httprequest = (HttpServletRequest)request;             String uri = httprequest.getRequestURI();int n1 =  uri.indexOf("login.jsp");//   >=0 存在int n2 =  uri.indexOf("register.jsp");int n3 = uri.indexOf("index.jsp");int n4 = -1;int n5 = -1;if(n1>=0 || n2>=0 ||n3>=0 ||n4>=0 ||n5>=0 ){ //假設是需要排除在外的資源//放行chain.doFilter(request, response);}else{//do something}}@Overridepublic void destroy() {// TODO Auto-generated method stub}
}

監聽器

監聽器是一個實現特定接口的普通Java程序,這個程序專門用于監聽另一個Java對象的方法調用或屬性改變,當被監聽對象發生上述事件后,監聽器某個方法立即被執行

超簡單代碼例子:

package listener;import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
/**
* 記錄每個請求的時間,客戶端IP,URL地址到日志文件中
* @author Administrator
*
*/
public class LogListener implements ServletRequestListener,ServletRequestAttributeListener{/*** 請求結束了*/@Overridepublic void requestDestroyed(ServletRequestEvent servletrequestevent) {// TODO Auto-generated method stub}/*** 請求開始了* 其實對于圖片、視頻、音頻、js、css也會有一個新的請求,所以也會被監聽*/@Overridepublic void requestInitialized(ServletRequestEvent sre) {//獲取要記錄的每個請求的時間,客戶端IP,URL地址Date now = new Date();HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();String addr = request.getRemoteAddr();String url = request.getRequestURL().toString(); //http://127.0.0.1:8081/myservlet/servlet/UserServletString qs = request.getQueryString();  //method=login//記錄到日志文件中PrintWriter pw = null;try {pw = new PrintWriter(new FileWriter("d:/requestlog.log", true));  //if(qs!= null){pw.println("time="+now.toLocaleString()+",addr="+addr+",url="+url+"?"+qs);}else{pw.println("time="+now.toLocaleString()+",addr="+addr+",url="+url);}                        } catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{pw.close();}}/*** request.setAttribute("error","用戶名不能為空");**/@Overridepublic void attributeAdded(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}/**** request.removeAttribute("error");*/@Overridepublic void attributeRemoved(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}/*** request.setAttribute("error","用戶名和密碼錯誤");*/@Overridepublic void attributeReplaced(ServletRequestAttributeEvent servletrequestattributeevent) {// TODO Auto-generated method stub}}<listener><listener-class>listener.LogListener</listener-class></listener>

?

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

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

相關文章

矩陣論-線性變換的特征值與特征變換

線性空間與線性變換綜述1.2 線性變換及其矩陣1.2.3 特征值與特征向量綜述 本系列博文主要總結學習矩陣論的心得筆記&#xff0c;參考數目《矩陣論》–張凱院&#xff1b;整個文章的整理體系參照行書過程。 1.2 線性變換及其矩陣 1.2.3 特征值與特征向量 本節討論如何選擇線…

Python(1)-源起、設計目標、設計哲學、特點

python簡介1. python的起源2. 解釋器3. python 語言的設計目標4. python 語言的設計哲學5. Python 特點人生苦短&#xff0c;我用python–吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;1. python的起源 1989年吉多在圣誕節想寫一個新的解釋程序作為ABC語言的繼承者。…

kaggle(05)---Event Recommendation Engine Challenge(基礎版)

文章目錄目錄1.比賽相關介紹1.1 比賽介紹1.2 數據集介紹1.3 評價標準介紹1.4 個人理解2. 解決方案2.1 統計用戶和event信息2.2 計算用戶相似度2.3 用戶社交關系信息處理2.4 構建event和event相似度數據2.5 活躍度/event熱度數據2.6 構建特征2.7 模型構建和預測3. 遇到的問題4. …

多校一道KMP+DP的題

難啊&#xff0c;多校當時根本不會做 題目描述 White Cloud has a rectangle carpet of n*m. Grid (i,j) has a color colorA[i][j] and a cost costA[i][j]. White Rabbit will choose a subrectangle B of p*q from A and the color of each grid is colorB[0...p-1][0..…

Python(2)-第一個python程序、執行python程序三種方式

第一個Python 程序1. 第一個Python 程序2. 常用兩Python個版本3. 程序執行的三種方式3.1 解釋器3.2 交互式運行Python程序3.3 IDE&#xff08;集成開發環境&#xff09;-pycharm1. 第一個Python 程序 Python 源程序就是一個特殊格式的文本文件&#xff0c;所以可以采用任意的文…

推薦算法---FM,協同過濾

文章目錄目錄1.FM算法產生背景2.FM算法模型3.FM算法VS其他算法4.推薦算法總結目錄 1.FM算法產生背景 在傳統的線性模型如LR中&#xff0c;每個特征都是獨立的&#xff0c;如果需要考慮特征與特征直接的交互作用&#xff0c;可能需要人工對特征進行交叉組合&#xff1b;非線性…

借助桶排序思想完成的一道題

問題&#xff1a; 數組排序之后的相鄰數的最大差值&#xff1b; 嗯&#xff0c;你可以排序&#xff0c;然后找相鄰的最大差值。 但是你覺得這么簡單我寫他干啥。 最優解&#xff1a;時間復雜度O(N)&#xff0c;空間O(1) 那我們開始說這種方法&#xff1a; 1&#xff09;遍…

Python(3)-Pycharm基本使用技巧

初識Pycharm1.界面2.恢復初始設置3.第一次打開Pycharm4.打開一個項目5.設置解釋器的版本。6.新建項目7.編輯器、控制臺的字體設置Pycharm–適合于開發管理大型項目&#xff0c;項目是用以解決復雜功能的軟件。1.界面 導航區–主要有什么文件 編輯區–編輯具體的文件 控制臺窗口…

推薦算法概述(01)

1.什么是推薦系統 用戶沒有明確的需求&#xff0c;你需要的是一個自動化的工具&#xff0c;它可以分析你的歷史興趣&#xff0c;從龐大的電影庫中找到幾部符合你興趣的電影供你選擇。這個工具就是個性化推薦系統。 推薦系統的主要任務 推薦系統的任務就是聯系用戶和信息&…

CSDN-Markdown編輯器使用小技巧

Markdown編輯器使用小技巧1.圖片無法顯示1.圖片無法顯示 1.檢查圖片的命名格式是否正確&#xff0c;數字不能作為圖片名稱開頭&#xff0c;雖然window操作系統下能夠識別&#xff0c;但是導入圖片的時候會造成無法顯示的錯誤。

何為布隆過濾器

問題的提出 我們有一個不安全網頁的黑名單&#xff0c;包含了100億個黑名單網頁的URL,每個網頁URL最多占用64B.。 現在我們要設計一個網頁過濾系統&#xff0c;這個系統要判斷該網頁是否在黑名單里&#xff0c;但是我們的空間有限&#xff0c;只有30GB. 允許有萬分之一的判斷…

推薦算法--利用用戶行為數據(02)

文章目錄目錄1.什么是用戶行為數據&#xff1f;1.1用戶行為分類2.用戶行為數據如何使用&#xff1f;2.1 用戶活躍度和物品流行度的分布2.2 用戶活躍度和物品流行度的關系2.3 協同過濾算法3.實驗設計和算法評測4.基于鄰域的的推薦算法4.1 基于用戶的協同過濾算法4.2 基于物品的協…

《Head First設計模式》第九章(2)組合模式

組合模式 ? 基于前一篇迭代模式的案例進行需求更新&#xff0c;餐廳的菜單管理系統需要有煎餅屋菜單和披薩菜單。現在希望在披薩菜單中能夠加上一份餐后甜點的子菜單。 在迭代模式中&#xff0c;披薩菜單是用數組維護的&#xff0c;我們需要讓披薩菜單持有一份子菜單&#xf…

Python(4)--Pycharm安裝、使用小技巧

Pycharm安裝1.專業版Pycharm 安裝2.設置Pycharm桌面快捷圖標3.Linux卸載一個軟件4.教育版Pycharm的安裝5.多文件項目演練&#xff08;Pycharm針對學生和教師開發了免費使用版&#xff09;1.專業版Pycharm 安裝 1.官網下載安裝包 .tar.gz 2.解壓縮 tar -zxvf 文件名 3.移動解壓…

推薦算法--推薦系統冷啟動問題(03)

文章目錄目錄1.什么是冷啟動問題&#xff1f;1.1冷啟動問題1.2 冷啟動問題的分類1. 用戶冷啟動2 物品冷啟動3 系統冷啟動2.如何解決冷啟動問題&#xff1f;2.1利用用戶注冊信息2.2選擇合適的物品啟動用戶的興趣2.3利用物品的內容信息2.4 發揮專家的作用目錄 1.什么是冷啟動問題…

《Head First 設計模式》第十章-狀態模式 狀態模式

狀態模式 策略模式和狀態模式是雙胞胎&#xff0c;在出生時才分開。你已經知道&#xff0c;策略模式是圍繞可以互換的算法來創建成功業務的&#xff0c;然而&#xff0c;狀態走的是更崇高的路&#xff0c;它通過改變對象內部的狀態來幫助對象控制自己的行為。 定義狀態模式 …

推薦算法--利用用戶標簽數據(04)

文章目錄流行的推薦系統通過3種方式聯系用戶興趣和物品 &#xff08;1&#xff09;&#xff1a;利用用戶喜歡過的物品&#xff0c;給用戶推薦與他喜歡過的物品相似的物品&#xff0c;這是基于物品的算法。 &#xff08;2&#xff09;&#xff1a;利用和用戶興趣相似的其他用戶…

Python(5)-注釋

Python注釋1.單行注釋2. 多行注釋&#xff08;塊注釋&#xff09;3.注釋的使用和代碼規范pyhton 的注釋 使用自己熟悉的語言&#xff08;中文&#xff09;&#xff0c;解釋代碼。Python解釋器在執行文件時不會執行井號右邊邊的內容。1.單行注釋 # 井號后面跟著注釋內容 灰灰的虛…

玩具kv數據庫

介紹 用java寫一個簡陋的kv數據庫&#xff08;倆小時的貨&#xff09;&#xff0c;用來復習一下java流知識、線程、socket等知識。 客戶端&#xff1a;很簡單的寫了一下功能&#xff1a;就是發送用戶的命令&#xff0c;還有接收數據顯示出來 服務端&#xff1a;redis類&#…

網絡原理知識點總結

第一章&#xff1a; 計算機網絡系統由資源子網和通信子網組成。 計算機網絡系統主要由網絡通信系統、操作系統和應用系統構成 互聯網基礎結構發展的三個階段&#xff1a; 第一階段&#xff1a;從單個網絡 ARPANET 向互聯網發展的過程。 第二階段&#xff1a;建成了三級結構…