日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java servlet filter_Java Servlet Filter

發布時間:2025/3/20 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java servlet filter_Java Servlet Filter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

做web開發的人對于Filter應該不會陌生,一直在很簡單的使用,但是一直沒有系統的總結一下,隨著年紀的慢慢長大,喜歡總結一些事情,下面說說我對Filter的理解,官方給出的Filter的定義是在請求一個資源或者從一個資源返回信息的時候執行過濾操作的插件。我們使用過濾起最多的場景估計就是在請求和返回時候的字符集轉換,或者權限控制,比如一個用戶沒有登錄不能請求某些資源。下面看一下Filter的集中類型:

Authentication Filters

Logging and Auditing Filters

Image conversion Filters

Data compression Filters

Encryption Filters

Tokenizing Filters

Filters that trigger resource access events

XSL/T filters

Mime-type chain Filter

Filters是在web.xml中配置的插件,Servlets和Filters相互沒有依賴,如果通過編輯web.xml來添加和刪除過濾器。

實現過濾器非常簡單,只需要實現javax.servlet.Filter接口,就可以實現一個過濾器,Filter接口定義的方法如下:

void init(FilterConfig?filterConfig))--在filter被加載到service中的時候被container調用,Servlet container實例化完filter以后立即調用Filter的init方法,init方法中的工作必須在執行過濾過濾任務之前正確的完成。

在以下情況下web container不能把filter加載到service中:

拋出ServletException異常。

在container定義的時間內沒有返回。

void doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)--Filter中的doFilter方法在每次request/response時候會被container調用,能夠傳遞到doFilter中的request或者response可以傳遞到Filter環中的下一個環節。?此時的Filter在設計模式中被稱作責任鏈模式結構,這里面抽象處理者的角色就是javax.servlet.Filter這個接口,注冊的所有Filter是具體的處理者,在doFilter方法中實現具體處理邏輯,在這里面責任鏈是一條直線,構成這條直線的就是所有注冊的Filter。

destroy--當filter從service中移除的時候,container調用destroy方法,通過調用這個方法,釋放Filter所占有的系統資源。

如何在web.xml中配置Filter

1

2 EcodingFilter

3 EcodingFilter

4 org.nb.filter.EnCodeFilter

5

6 EncodeCoding

7 UTF-8

8

9

我們可以使用如下方法來給Filter匹配指定的servlet 資源或者url-pattern:

1

2 EcodingFilter

3 *

4 *

5

在這里需要注意的是,在給servlet注冊filter環,container首先處理的是url-patterns,然后才處理servlet-names,所以如果要對filter的執行順序有要求,那么在此需要注意。下面我們創建一個web工程,來實踐一下Filter:

web.xml內容:

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns="http://java.sun.com/xml/ns/javaee"

4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

5 version="3.0">

6 FilterTest

7

8 index.html

9

10

11 EcodingFilter

12 EcodingFilter

13 org.nb.filter.EnCodeFilter

14

15 EncodeCoding

16 UTF-8

17

18

19

20 EcodingFilter

21 hello

22 *

23

24

25 hello

26

27

28

29 hello

30 /*

31

32

HelloServlet.java內容:

1 packageorg.nb.action;2

3 importjava.io.IOException;4 importjava.io.PrintWriter;5

6 importjavax.servlet.ServletException;7 importjavax.servlet.annotation.WebServlet;8 importjavax.servlet.http.HttpServlet;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11

12 @WebServlet("/helloServlet")13 public class HelloServlet extendsHttpServlet {14 private static final long serialVersionUID = 1L;15

16 protected voiddoPost(HttpServletRequest request,17 HttpServletResponse response) throwsServletException, IOException {18 PrintWriter out =response.getWriter();19 out.println("Hello.");20 }21 }

EnCodeFilter.xm內容:

1 packageorg.nb.filter;2

3 importjava.io.IOException;4 importjava.util.Enumeration;5 importjava.util.HashMap;6 importjava.util.Map;7

8 importjavax.servlet.Filter;9 importjavax.servlet.FilterChain;10 importjavax.servlet.FilterConfig;11 importjavax.servlet.ServletException;12 importjavax.servlet.ServletRequest;13 importjavax.servlet.ServletResponse;14

15 public class EnCodeFilter implementsFilter {16

17 Map params = new HashMap();18

19 @Override20 public voiddestroy() {21 System.out.println("EncodeFilter destroy");22 }23

24 @Override25 public voiddoFilter(ServletRequest request, ServletResponse response,26 FilterChain chain) throwsIOException, ServletException {27 String encodeCoding = params.get("EncodeCoding");28 request.setCharacterEncoding(encodeCoding);29 response.setCharacterEncoding(encodeCoding);30 chain.doFilter(request, response);31 System.out.println("EncodeFilter doFilter");32 }33

34 @Override35 public void init(FilterConfig cfg) throwsServletException {36 Enumeration names =cfg.getInitParameterNames();37 while(names.hasMoreElements()) {38 String name =names.nextElement();39 params.put(name, cfg.getInitParameter(name));40 }41 System.out.println("EncodeFilter init");42 }43

44 }

在tomcat啟動的時候Console輸出的內容:

三月 24, 2014 5:56:12下午 org.apache.catalina.core.AprLifecycleListener init

信息: The APR based Apache Tomcat Native librarywhich allows optimal performance in production environments was not found on the java.library.path: E:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\M1 Licensing;C:\Program Files\Broadcom\Broadcom 802.11 Network Adapter\Driver;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\PROGRAM FILES (X86)\INTEL\ICLS CLIENT\;C:\PROGRAM FILES\INTEL\ICLS CLIENT\;C:\Windows\SYSTEM32;C:\Windows;C:\Windows\SYSTEM32\WBEM;C:\Windows\SYSTEM32\WINDOWSPOWERSHELL\V1.0\;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\2.0\BIN\X86;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\2.0\BIN\X64;C:\PROGRAM FILES\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\DAL;C:\PROGRAM FILES\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\IPT;C:\PROGRAM FILES (X86)\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\DAL;C:\PROGRAM FILES (X86)\INTEL\INTEL(R) MANAGEMENT ENGINE COMPONENTS\IPT;C:\PROGRAM FILES (X86)\LENOVO\ACCESS CONNECTIONS\;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x64;E:\Ruby200\bin;E:\Program Files\TortoiseSVN\bin;E:\Program Files\MySQL\MySQL Utilities 1.3.4\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;E:\Program Files\Java\jdk1.7.0_40\bin;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;F:\instantclient;.;;.;;.

三月24, 2014 5:56:12下午 org.apache.tomcat.util.digester.SetPropertiesRule begin

警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:FilterTest' did not finda matching property.

三月24, 2014 5:56:13下午 org.apache.coyote.AbstractProtocolHandler init

信息: Initializing ProtocolHandler ["http-bio-8080"]

三月24, 2014 5:56:13下午 org.apache.coyote.AbstractProtocolHandler init

信息: Initializing ProtocolHandler ["ajp-bio-8009"]

三月24, 2014 5:56:13下午 org.apache.catalina.startup.Catalina load

信息: Initialization processedin 1031ms

三月24, 2014 5:56:13下午 org.apache.catalina.core.StandardService startInternal

信息: Starting service Catalina

三月24, 2014 5:56:13下午 org.apache.catalina.core.StandardEngine startInternal

信息: Starting Servlet Engine: Apache Tomcat/7.0.8EncodeFilter init

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory docs

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory examples

三月24, 2014 5:56:13下午 org.apache.catalina.core.ApplicationContext log

信息: ContextListener: contextInitialized()

三月24, 2014 5:56:13下午 org.apache.catalina.core.ApplicationContext log

信息: SessionListener: contextInitialized()

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory host-manager

三月24, 2014 5:56:13下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory manager

三月24, 2014 5:56:14下午 org.apache.catalina.startup.HostConfig deployDirectory

信息: Deploying web application directory ROOT

三月24, 2014 5:56:14下午 org.apache.coyote.AbstractProtocolHandler start

信息: Starting ProtocolHandler ["http-bio-8080"]

三月24, 2014 5:56:14下午 org.apache.coyote.AbstractProtocolHandler start

信息: Starting ProtocolHandler ["ajp-bio-8009"]

三月24, 2014 5:56:14下午 org.apache.catalina.startup.Catalina start

信息: Server startupin 978 ms

其中有filter,init方法的輸出,下面創建一個index.html文件,內容如下:

1

2

3

4

5

Insert title here

6

7

8

9

10

11

12

點擊index.html頁面的按鈕,

此時Console輸出內容:

1 EncodeFilter doFilter

每次請求都會有這樣一條輸出。

關閉tomcat的時候,注意觀察Console輸出的內容:

三月 24, 2014 6:08:33 下午 org.apache.catalina.core.StandardServer await

信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.

三月 24, 2014 6:08:33 下午 org.apache.coyote.AbstractProtocolHandler pause

信息: Pausing ProtocolHandler ["http-bio-8080"]

三月 24, 2014 6:08:34 下午 org.apache.coyote.AbstractProtocolHandler pause

信息: Pausing ProtocolHandler ["ajp-bio-8009"]

三月 24, 2014 6:08:35 下午 org.apache.catalina.core.StandardService stopInternal

信息: Stopping service Catalina

EncodeFilter destroy

三月 24, 2014 6:08:36 下午 org.apache.catalina.core.ApplicationContext log

信息: SessionListener: contextDestroyed()

三月 24, 2014 6:08:36 下午 org.apache.catalina.core.ApplicationContext log

信息: ContextListener: contextDestroyed()

三月 24, 2014 6:08:37 下午 org.apache.coyote.AbstractProtocolHandler stop

信息: Stopping ProtocolHandler ["http-bio-8080"]

三月 24, 2014 6:08:37 下午 org.apache.coyote.AbstractProtocolHandler stop

信息: Stopping ProtocolHandler ["ajp-bio-8009"]

此時Fileter的Destroy方法被調用。Filter的生命周期結束。這篇文章中包含一些信息,如Server,Service,Container等,可能有些人跟我一樣開始的時候對此很不了解,如果這樣大家可以查一下Tomcat等web容器的工作原理,如果有什么地方我說的不清楚,或者有錯誤,那么請提醒我,謝謝。

總結

以上是生活随笔為你收集整理的java servlet filter_Java Servlet Filter的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。