Filter

一、簡介

  Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp,Servlet,靜態圖片文件或靜態html文件進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮相印信息等一些高級功能。

  Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。

  Filter接口共定義了如下方法:

  destroy()、doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)、init(FilterConfig filterConfig);

二、filter在開發中的常見應用

  1、filter可以在目標資源執行之前,運行權限檢查,檢查用戶有無權限。選擇是否放行。

  2、filter可以在放行之前,對request和response進行預處理,從而實現一些全局性的設置。

  3、filter在放行之后,可以捕獲到目標資源的輸出,從而對輸出做類似于壓縮這樣的設置。

三、filter鏈

  多個filter組成filter鏈。按順序依次執行。

  執行先后次序按照web.xml中<filter-mapping>位置的先后順序。

四、filter生命周期

  init()方法執行時filter創建,服務器在啟動時就執行filter的init()方法創建了該filter對象,該對象被所有的攔截請求所共享。

  distroy()方法執行時filter被摧毀,當移除服務器中的web應用或者停止服務器時服務器調用distroy()方法摧毀filter。

五、filter()初始化參數

  <filter><init-param><param-name></><param-value></></></>

  服務器啟動時會將參數封裝到filterConfig中并傳遞給init方法,供filter調用。

六、filter增強

  對一個對象增強一般共有如下三種方式:

  1、寫子類

  2、用包裝模式

  3、動態代理

   包裝模式五步:1、寫一個類,實現與被增強對象相同的接口;2、定義一個變量,記住被增強對象;3、定義一個構造方法,接受被增強對象;4、覆蓋需要增強的方法;5、對于不需要增強的方法,直接調用被增強對象(目標對象)的方法

  可使用包裝模式實現對doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)中的ServeltRequest、ServletResponse對象增強;

  例如對ServletRequest的getParamter()方法增強來解決全棧的get方式的請求的亂碼問題;

?七、Filter映射<dispatcher>

  filter配置中<filter-mapping>中可包含<dispatcher>元素,該元素用于指定過濾器攔截的資源被Servlet容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多個<dispatcher>子元素用來指定Filter對資源的多種調用方式進行攔截。

  web資源調用共四種方式,即上述四種,

  REQUEST攔截器介于服務器與request請求的資源之間,該攔截器作用于request請求資源時。

  INCLUDE,FORWARD攔截器介于服務器與被包含的資源及轉發的資源之間,該攔截器作用于訪問資源中有include、forward標志時服務器調用指定頁面(資源)。

  ERROR攔截器介于服務器與錯誤資源之間,該攔截器作用于訪問資源發生錯誤并向服務器拋出異常時,服務器調用對應的錯誤處理頁面(資源)。

轉載于:https://www.cnblogs.com/songpanyard/p/8471144.html

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

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

相關文章

前端面試手寫題

深拷貝 // 深拷貝 function deepClone(ori) {let tar;if (typeof ori object && ori ! null) {tar Array.isArray(ori) ? [] : {}for (let k in ori) {if (ori.hasOwnProperty(k)) {tar[k] deepClone(ori[k])}}} else {tar ori}return tar}繼承 // 圣杯模式實現…

node --- 使用express.Router與body-parser

express框架提供了一個Router方法,用于監聽路由 // 命令行(windows*64) npm install express --save// router.js const express require("express"); // 定義路由 const router express.Router();// 處理http://host:port/students/ 路由(GET方法) router.get…

python基礎1 第一天

TEST 1 阿斯蒂芬 day1test1 while 1&#xff1a;print&#xff08;333&#xff09; import randomprint轉載于:https://www.cnblogs.com/shuangzhu/p/9243853.html

【數據庫】《SQL必知必會 4th》部分筆記

9.匯總數據 count(*) 包括空 count(name) 不包括空 10.分組數據 group by 分組 having 過濾分組 where 過濾行 11.子查詢 select .. from .. where in (select ...) 由內向外處理 A.子查詢過濾 作為子查詢的語句只能查詢單個列。 B.作為計算字段使用子查詢 select cust_name, …

微軟認知服務應用秘籍 – 漫畫翻譯篇

概述 微軟認知服務包括了影像、語音、語言、搜索、知識五大領域&#xff0c;通過對這些認知服務的獨立或者組合使用&#xff0c;可以解決很多現實世界中的問題。作為AI小白&#xff0c;我們可以選擇艱難地攀登崇山峻嶺&#xff0c;也可以選擇像牛頓一樣站在巨人的肩膀上。本章節…

01 React初步認知、React元素、渲染、工程化

定義 react&#xff1a;用于構建用戶界面的 JavaScript 庫 &#xff08;僅負責View層渲染、應在視圖上體現交互邏輯&#xff09;vue&#xff1a;漸進式JavaScript 框架&#xff08;MVVM&#xff09; 使用 引入CDN腳本添加根容器 div #app創建React組件 ReactDOM.render Re…

node --- 在express中配置使用模板引擎(art-template)

下載依賴: npm install --save art-template express-art-template配置: // app.js const express require("express"); const app express(); app.engine("html", require("express-art-template"));使用: 例如處理瀏覽器GET請求 /students…

PAM認證機制

一、PAM簡介 Sun公司1995年開發的一種與認證相關的通用框架機制&#xff0c;PAM只關注如何為服務驗證用戶的API&#xff0c;通過提供一些動態鏈接庫和一套統一的API&#xff0c;將系統提供的服務和該服務的認證方式分開&#xff1b;PAM只是一個框架而已&#xff0c;自身不做認證…

02 JSX學習

使用vite處理jsx vite引入的腳本必須是ESM的 npm init -y yarn add vite package.json 添加vite命令 index.html引入jsxJSX是什么 一種標簽語法&#xff0c;在JS基礎上進行的語法擴展不是字符串、也不是HTML是描述UI呈現與交互的直觀的表現形式JSX被編譯后會生成React元素 &am…

使用FreeCookies 控制瀏覽器cookies及修改http響應內容

FreeCookies 插件安裝 1&#xff1a;您的計算機需要已經安裝Fiddler &#xff08;如未安裝&#xff0c;請至官網下載安裝 http://docs.telerik.com/fiddler/configure-fiddler/tasks/configurefiddler&#xff09; 2&#xff1a;進入Fiddler安裝目錄下的Scripts目錄下&#xff…

node --- 使用node連接mysql

1.確保下載了mysql,且mysql處于打開狀態. 2.確保下載了node,并成功安裝:https://nodejs.org/en/ (小黑窗 node -v 查看) 3.安裝node操作mysql的依賴包: # 命令行 npm install --save -mysql# 注:如果沒有package.json 建議先使用 npm init -y 初始化正題 // app.js// 1. 引…

03 渲染元素ReactDOM.render

React與ReactDOM是2個不同的庫&#xff0c;根節點內的所有內容&#xff08;和DOM更新、渲染相關&#xff09;由ReactDOM來管理一個React應用只有一個根節點用ReactDOM.render將React元素渲染到根節點 ReactDOM.render 參數1 React元素&#xff08;React.createElement(類組件/…

javascript --- 異步按順序執行

使用promise可以很優雅的封裝一個異步函數,使其按指定順序執行: // 異步讀取文件操作 const fs require("fs"); function promiseReadFile(url) {return new Promise(function (resolve, reject) {fs.readFile(url, function(err, data) {if(err) {reject(err);} e…

web提高:負載均衡

1、集群 1、為什么建議在阿里云購買負載均衡 非常便宜&#xff0c;又好用&#xff0c;有穩定&#xff0c;有簡單。自己搭建不了負載均衡&#xff0c;因為共有云不支持組播跑不了vrp協議。你不會集群的概念&#xff0c;你還是蒙蒙的。2、為什么使用集群&#xff1f; 1、小規模 …

node --- 一個很好用的包json-server

這個第三方包,可以將json文件暴露出來,用http獲取. (data.json如下) 下載依賴: npm install --g json-server查看是否含有json-server json -sever --version啟動json-server 參考:https://www.npmjs.com/package/json-server

04 組件與Props

一些概念 組件&#xff1a;視圖的片段、內部管理數據集合&#xff08;state&#xff09;外部傳入配置結合&#xff08;props&#xff09;包含&#xff1a; 1. 視圖標記&#xff08;React的JSX、Vue的template&#xff09;需要經過轉換而成為真實的DOM 事件 數據 邏輯&#x…

利用ionic3進行上一行和左一行不動,中間移動的功能

首先在html中的寫法是 <ion-header><ion-navbar><ion-title>歷史數據</ion-title></ion-navbar></ion-header><ion-content ><div style"display:flex;width:625px;"><div class"head">地區</di…

05 state與setState、單向數據流

聲明周期與組件卸載 props配置&#xff1a;使用組件時傳入數據state私有數據&#xff1a;組件內部使用的數據 state的使用注意事項 必須使用setState方法來更改state多個setState會合并調用props和state更新數據要謹慎&#xff08;有可能在異步程序中更新&#xff09;setState…

HDU 3342 Legal or Not(拓撲排序)

描述 ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When someone…

jquery --- 阻止表單默認的提交行為,標準化表單的數據

表單如下: // .html <form id"topics_new_form" method"post" action"/topics/new"><div class"form-group"><label for"exampleInputEmail1">選擇模塊</label><selecet class"form-contr…