一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JavaWeb之Filter過濾器詳解

JavaWeb之Filter過濾器詳解

2020-08-29 11:56社會主義接班人 Java教程

本篇文章主要介紹了JavaWeb之Filter過濾器詳解,實例分析了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,兩個圖如下

JavaWeb之Filter過濾器詳解

2.創建Filter

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

?
1
public class MyFilter implements Filter

3.在doFilter中實現防盜鏈

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 {
    
  }
}

4.Filter配置

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

?
1
2
3
4
5
6
7
8
<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>

5.測試

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

?
1
2
3
4
5
6
7
8
9
10
11
12
<%@ 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>

JavaWeb之Filter過濾器詳解

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

JavaWeb之Filter過濾器詳解

四、遇到的問題

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

五、總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/5ishare/p/6557079.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91久久99热青草国产 | 日日艹 | 果冻传媒天美传媒乌鸦传媒 | 狠狠狠地啪香蕉 | 日日摸日日碰夜夜爽97纠 | 亚洲国产精品无圣光一区二区 | 五月激情丁香婷婷综合第九 | 欧美精品一区二区三区免费观看 | 91在线视频国产 | 国产v视频 | 亚洲va欧美va国产va天堂影 | 男女姓交大视频免费观看 | 男人肌肌捅女人肌肌 | 性做久久久久久久久浪潮 | 国产精品区一区二区免费 | 狠狠综合视频精品播放 | 日本96在线精品视频免费观看 | 国产成人精品曰本亚洲77美色 | 日韩永久在线观看免费视频 | 999热在线精品观看全部 | h网站国产 | 青青青视频免费观看 | 午夜AV亚洲一码二中文字幕青青 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲国产欧美目韩成人综合 | 波多野结衣作品在线观看 | 日本www午夜色在线视频 | 俄罗斯freeoo性另类 | 日本五级床片全都免费播放 | 北条麻妃一区 | 奇米激情| 日本大学生xxxxx69泡妞 | 日本中文字幕黑人借宿影片 | ts人妖国产一区 | 日韩一二三 | 色老头影视| 亚洲www在线 | 好湿好紧太硬了我好爽 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 国产亚洲精品久久yy5099 | 高h细节肉爽文办公室 |