JavaWeb之Filter過濾器

原本計劃這一篇來總結JSP,由于JSP的內容比較多,又想著晚上跑跑步減減肥,所以今天先介紹Filter以及它的使用舉例,這樣的話還有些時間可以鍛煉鍛煉。言歸正傳,過濾器從字面理解她的話有攔網、過濾的功能,可以算是JavaWeb的攔精靈。

一、由來

客戶端發起請求,那服務器不能什么請求都做出響應,做攔截處理,不僅能減輕服務器的壓力,還能保護數據的安全,同樣服務端做出響應給客戶端時有時也需要進行過濾,比如我們常見的圖片添加水印。為了處理這些問題,于是過濾器出現了。有時不僅僅對請求與響應進行一層的過濾,可能會過濾多層,所以提出了濾鏡鏈(FilterChain)的概念.

二、使用

在使用它之前先熟悉下它的作用的地方。過濾器作用在請求Request到達Servlet之前以及響應Response到達瀏覽器之前會依次經過過慮鏈。有些類似asp.net中的httpmodule.使用Filter主要是實現javax.servlet.filter接口。查看API可看到有3個方法。

1.public void init(FilterConfig filterConfig) throws ServletException

由 Web 容器調用,指示將放入服務中的過濾器。servlet 容器只在實例化過濾器之后調用一次 init 方法。在要求過濾器做任何過濾工作之前,init 方法必須成功完成。如果 init 方法拋出 ServletException或沒有在 Web 容器定義的時間段內返回,則 Web 容器無法將過濾器放入服務中。這個和Servlet的生命周期有點類似,也是只初始化一次,destroy()也是執行一次。

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException

每次由于對鏈末尾的某個資源的客戶端請求而通過鏈傳遞請求/響應對時,容器都會調用 Filter 的 doFilter 方法。傳入此方法的 FilterChain 允許 Filter 將請求和響應傳遞到鏈中的下一個實體。
此方法的典型實現遵循以下模式:
1. 檢查請求
2. 有選擇地將帶有自定義實現的請求對象包裝到用于輸入過濾的過濾器內容或頭中
3. 有選擇地將帶有自定義實現的響應對象包裝到用于輸出過濾的過濾器內容或頭中
4. a) 既可以使用 FilterChain 對象 (chain.doFilter()) 調用鏈中的下一個實體,
4. b) 也可以不將請求/響應對傳遞給過濾器鏈中的下一個實體,從而阻塞請求處理
5. 在調用過濾器鏈中的下一個實體之后直接設置響應上的頭。

3.public void destroy()

由 Web 容器調用,指示將從服務中取出的過濾器。此方法僅在過濾器的 doFilter 方法中的所有線程都已退出之后調用一次,或者在過了超時期之后調用。在調用此方法之后,Web 容器不會再對此過濾器實例調用 doFilter 方法。此方法為過濾器提供了一個清除持有的所有資源(比如內存、文件句柄和線程)的機會,并確保任何持久狀態都與內存中該過濾器的當前狀態保持同步。

三、案例

使用過濾器的地方有很多,這里就不一一舉例,下面的demo在上篇博客中HelloWorld項目的基礎上實現防盜鏈的功能,以此體會Filter的使用。

1.準備

在HelloWolrd項目中新增一個文件夾,在文件夾中放入兩個圖片一個err.png 一個test.png,兩個圖如下

2.創建Filter

這里也沒新建Filter包,直接在上一博客中的com.test.cyw包中創建Filter文件MyFilter,應該是創建一個包專門管理Filter類的額,這里只是做測試。創建完成之后可以看到MyFilter繼承Filter。

public class MyFilter implements Filter 
View Code

3.在doFilter中實現防盜鏈

package com.test.cyw;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.*;/*@WebFilter("/MyFilter")*/
public class MyFilter implements Filter {public MyFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse res=(HttpServletResponse)response;String referer=req.getHeader("referer");//鏈接來源地址if(referer==null||!referer.contains(req.getServerName())){req.getRequestDispatcher("/Images/err.png").forward(req, res);return;}chain.doFilter(req, res);}public void init(FilterConfig fConfig) throws ServletException {}
}
View Code

4.Filter配置

上面只是創建了一個類實現了Filter接口,如何讓Tomcat知道呢,這和Servlet類似,需要在Web.xml中配置。和配置servlet有點相同。

  <filter><filter-name>MyFilter</filter-name><filter-class>com.test.cyw.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/Images/*</url-pattern></filter-mapping>
View Code

5.測試

新建一個test.jsp文件,在jsp中顯示img,可以正常顯示

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="防盜鏈" src="Images/test.png" width="400">
</body>
</html>
View Code

如果直接在瀏覽器輸入test.png的地址,則會顯示err.png

四、遇到的問題

開始的時候由于地址錯誤,導致谷歌瀏覽器test.jsp中顯示的也是err.png的圖片,但當我換過來時刷新頁面還是沒變,這個讓我很納悶。有時候將Tomca重啟也不行,試了好幾次都是這樣,實在不行了用IE試了下沒想到顯示是正確的,原來谷歌瀏覽器有緩存,導致顯示的不正確。

五、總結

Filter用處很多,網上也有好多的例子,做項目時可以先實現一些常用的例如水印,等用的時候只需配置下xml就能解決,很是方便。

轉載于:https://www.cnblogs.com/5ishare/p/6557079.html

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

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

相關文章

【ArcGIS微課1000例】0054:尺寸注記的創建與編輯

尺寸注記要素是一種特殊類型的文本,用于顯示地圖上的長度或距離,可以創建各種形狀的尺寸注記要素,如對齊、簡單對齊、水平線狀、垂直線狀和旋轉線狀等。 文章目錄 一、創建尺寸注記1. 直接創建尺寸注記要素2. 通過已有尺寸注記要素創建二、編輯尺寸注記1. 刪除尺寸注記要素2…

利用python實現批量查詢ip地址歸屬地址

今天需要查詢nginx訪問的客戶端ip是否和調度一樣&#xff01;先是用shell把文件中的ip截取出來&#xff1a; python腳本如下&#xff1a;&#xff08;哈哈&#xff0c;新手寫的很草率&#xff09;#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

Cobbler部署之FAQ處理

Cobbler報錯處理 通過cobbler check檢查出現的報錯 紅色標注為報錯關鍵信息 9.1 報錯一 # cobbler check httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Original traceback: Traceback (most recent call last): File "/usr…

基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

堪比JMeter的.Net壓測工具 - Crank 入門篇

1. 前言 Crank 是.NET 團隊用來運行基準測試的基準測試基礎架構&#xff0c;包括&#xff08;但不限于&#xff09;來自TechEmpower Web 框架基準測試的場景,是2021年.NET Conf 大會上介紹的一項新的項目&#xff0c;其前身是Benchmarks。 Crank目標之一是為開發人員提供一種工…

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地類型的矢量圖層

Globalmapper中可以很方便的根據指定的字段,對矢量數據進行批量提取,生成不同類型的多個矢量數據,本文以土地利用現狀數據為例,基于DLMC,提取出不同用地類型的矢量圖層。 參考閱讀:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量篩選不同類型的圖斑(以土地利用數據…

javascript閉包—圍觀大神如何解釋閉包

閉包的概念已經出來很長時間了&#xff0c;網上資源一大把&#xff0c;本著拿來主意的方法來看看。 這一篇文章 學習Javascript閉包&#xff08;Closure&#xff09; 是大神阮一峰的博文&#xff0c;作者循序漸進&#xff0c;講的很透徹。下面一一剖析。 1.變量的作用域 變量的…

298. Binary Tree Longest Consecutive Sequence

題目&#xff1a;Given a binary tree, find the length of the longest consecutive sequence path. The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to…

Educational Codeforces Round 37 (Rated for Div. 2)

Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 題意&#xff1a;Max想給花園澆水。花園可被視為長度為n的花園床&#xff0c;花園內共有k個水龍頭&#xff0c;分別在花園的xi&#xff08;0≤xi<n&#xff09;處&#xff0c;在j秒內花園的[xi-(j-1…

詳解 .Net6 Minimal API 的使用方式

隨著 .Net6 的發布&#xff0c;微軟也改進了對之前 ASP.NET Core 構建方式&#xff0c;使用了新的 Minimal API 模式。以前默認的方式是需要在 Startup 中注冊 IOC 和中間件相關&#xff0c;但是在 Minimal API 模式下你只需要簡單的寫幾行代碼就可以構建一個 ASP.NET Core的We…

.NET 20周年專訪 - 張善友:.NET 技術是如何賦能并改變世界的

點擊藍字關注我們今年是 .NET 發布20周年&#xff0c;值此20周年之際&#xff0c;微軟 Reactor 特別策劃了 .NET 20周年系列主題專訪。我們邀請了數位中國 .NET 領域的技術專家以及社區名人&#xff0c;來聊聊他們與 .NET 的情緣、認識 .NET 的契機、選擇 .NET 的理由&#xff…

【ArcGIS錯誤異常100問】之005:ArcGIS字段計算器python中文編碼問題解決

問題描述&#xff1a; 現因工作的需要&#xff0c;對照2017最新版&#xff1a;《土地利用現狀分類》&#xff08;GBT 21010-2017&#xff09;&#xff0c;需根據DLMC對DLBM進行批量修改&#xff0c;如旱地是0103&#xff0c;其他林地是0307等&#xff0c;共計19種用地類型。 問…

【ArcGIS微課1000例】0055:根據圖層創建自定義圖例符號案例教程

在利用ArcGIS作圖時,有時候需要根據線狀或面狀圖層自己的矢量形狀去創建圖例項目符號,本文講解根據圖層創建自定義圖例符號。 本實驗使用的數據為配套案例數據包中的0055.rar中的水庫數據。 文章目錄 1. 添加“新建圖例圖面形狀”工具2. 根據圖層形狀創建符號3. 繪制形狀符號…

jQuery 3.3.1已經發布,開發團隊正在準備4.0版本

\看新聞很累&#xff1f;看技術新聞更累&#xff1f;試試下載InfoQ手機客戶端&#xff0c;每天上下班路上聽新聞&#xff0c;有趣還有料&#xff01;\\\jQuery 3.3.1已經發布&#xff0c;其中包含了許多新特性也提出要移除幾個之前的特性&#xff0c;移除一些特性是為了jQuery …

C#.NET版本、Visual Studio版本對應關系

C#版本.NET版本Visual Studio版本發布日期特性C# 1.0.NET Framework 1.0Visual Studio .NET 20022002-02-13委托、事件C# 1.1.NET Framework 1.1Visual Studio .NET 20032003-04-24APM&#xff08;異步編程模型&#xff09;C# 2.0.NET Framework 2.0Visual Studio 20052005-11-…

真魔法!圖形化管理 Kafka 超輕量的自動化工具

Kafka Magic[1] 是一個用于處理 Apache Kafka 集群的 GUI 工具。它可以查找和顯示消息、在 Topic 之間轉換和移動消息、查看和更新模式、管理 Topic 以及自動化復雜任務。Kafka Magic 通過方便的用戶界面促進 Topic 管理、QA 和集成測試。Kafka Magic Community Edition 可免費…

前端工程構建工具——Yeoman

一、Yeoman 簡介 通常在開發新項目時我們都需要配置工程環境&#xff0c;開發目錄&#xff0c;需要下載一些庫、框架文件&#xff08;如 jQuery、Backbone 等&#xff09;&#xff0c;配置編譯環境&#xff08;Less、Sass、Coffeescript等&#xff09;&#xff0c;甚至還要配置…

【FME實戰教程】001:FME2020中文安裝圖文教程(附安裝包下載)

文章目錄1. 安裝license2. 安裝FME Desktop3. 安裝中文語言4. FME軟件下載地址1. 安裝license 打開軟件安裝包中的fme-flexnet-win-x64.msi&#xff0c;如下圖所示&#xff1a; 點擊Next。 點擊Next。 單擊install。 點擊finish&#xff0c;完成。 &#xff08;1&#xff09;修…

算法導論 第三部分——基本數據結構——第14章:數據結構的擴張

本章通過擴張紅黑樹構造出兩種數據結構&#xff1a;動態順序統計和區間樹。 1、動態順序統計&#xff1a;查找倒數第i小的數據 復雜度為 lg(n) 為什么是擴張紅黑樹而不是搜索二叉樹或者二叉樹&#xff1f; 相對于搜索二叉樹&#xff0c;紅黑樹的平衡性更好&#xff0c;高度在l…

/hgfs下無共享文件夾?/mnt下沒有hgfs文件夾?vmhgfs-fuse:找不到命令?

前言&#xff1a;最近在使用linux的過程中&#xff0c;需要在宿主操作系統與客戶操作系統間建立共享文件夾&#xff0c;遇到了些許問題&#xff0c;在網上參考了許多文章與各種嘗試后&#xff0c;現得以解決&#xff0c;分享如下。1、系統環境&#xff1a;宿主操作系統&#xf…