filter的功能是改變請求與響應
在乙個請求到達servlet之前處理request
在離開servlet的時候處理 response
所以利用filter可以檢查request和response, 根據需要也可以修改request頭 和 response頭
對於spring boot, filter配置可以使用原始的配置, 也可以使用新的配置方式
如下只以新的配置方式為例:
1. 建立乙個類, 讓它繼承filter
public class stealsource implements filter
2.在類上加@webfilter註解, 並新增要過濾的請求位址
@webfilter(urlpatterns="/*", filtername="handall")
public class stealsource implements filter
3.在spring boot的啟動器上新增註解, 將要用到的filter加入進來
@servletcomponentscan(basepackageclasses=stealsource.class) // stealsource為要使用的filter
經過上面簡單的配置就可以正常使用了
網路上的資源, 有些我們拿來可以直接訪問, 有些不能訪問
先開啟乙個網頁, 然後找到原碼(f12), 這裡就可以看到***的具體內容是什麼
當我們把這個***內容拷貝出來放入瀏覽器位址列請求, 發現有些有效, 有些無效
經過測試和查詢, 無效是由於鏈結防盜, 它設定了不能從外部網域名稱進入到伺服器
如下通過filter簡單設定防盜鏈結
原理: 請求的網域名稱不等於伺服器網域名稱就不能通過
傳送乙個請求時, 如下:
位址為:
網域名稱為: mp.csdn.net
使用request.getheader("referer"); 獲取位址
使用request.getservername(); 獲取網域名稱
伺服器網域名稱不變, 關鍵就是看請求的位址中是否有伺服器的網域名稱
如果你是從位址輸入的, 則後台伺服器獲取的位址為空
如果是從其它頁面中請求的, 則網域名稱不是伺服器網域名稱
如果是從伺服器中的頁面請求的, 則網域名稱與伺服器網域名稱相同
實現**:
@webfilter(urlpatterns="/*", filtername="handall")
public class stealsource implements filter
@override
public void dofilter(servletrequest req, servletresponse res, filterchain chain)
throws ioexception, servletexception
/* 發起請求網域名稱或ip*/
string address = request.getservername();
boolean contains = referer.contains(address);
/*如果不包含, 即發起請求的點不是本站的頁面*/
if (!contains)
// 放行
chain.dofilter(request, response);
} @override
public void destroy()
}
最關鍵是要理解 request.getservletname()
獲取的是**的網域名稱, 比如從index.html 的 a標籤 傳送的請求
後台使用request.getservletname() 獲取到的就是index所屬專案的網域名稱
如果是本地建立乙個html頁面(不在專案中)來傳送請求, 獲取的就是localhost, 也就是本在ip
所以只能由專案所屬頁面傳送的請求才能通過filter, 從而達到 防盜 的目的
Springboot自定義過濾器Filter
前言 自己寫了個springboot專案,最近寫的功能越來越多,結合業務已經要寫過濾器filter來過濾處理一些請求。在網上看了幾篇部落格,總結如下 過濾器配置方式有兩種 1 通過 webfilter註解來配置 2 通過 bean註解來配置 第一步 首先自己先寫個過濾器類 myfilter,此類必須...
lucene中search內建的Filter
先來看一下rangefilter public static void printfilter string path throws ioexception system.out.println 其實這段 沒什麼,就增加了下面這段 rangefilter filter new rangefilter...
python3學習之map函式和filter函式
map 函式可以對乙個資料進行同等迭代操作。例如 def f x return x x r map f,1,2,3,4,5,6,7,8,9 print list r map函式傳入的第乙個引數就是函式本身,即f。第二個引數是要操作的資料 map 作為高階函式,事實上它把運算規則抽象了,因此,我們不 ...