java servlet filter_Java Servlet Filter
做web開發(fā)的人對于Filter應(yīng)該不會陌生,一直在很簡單的使用,但是一直沒有系統(tǒng)的總結(jié)一下,隨著年紀(jì)的慢慢長大,喜歡總結(jié)一些事情,下面說說我對Filter的理解,官方給出的Filter的定義是在請求一個資源或者從一個資源返回信息的時候執(zhí)行過濾操作的插件。我們使用過濾起最多的場景估計就是在請求和返回時候的字符集轉(zhuǎn)換,或者權(quán)限控制,比如一個用戶沒有登錄不能請求某些資源。下面看一下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來添加和刪除過濾器。
實現(xiàn)過濾器非常簡單,只需要實現(xiàn)javax.servlet.Filter接口,就可以實現(xiàn)一個過濾器,Filter接口定義的方法如下:
void init(FilterConfig?filterConfig))--在filter被加載到service中的時候被container調(diào)用,Servlet container實例化完filter以后立即調(diào)用Filter的init方法,init方法中的工作必須在執(zhí)行過濾過濾任務(wù)之前正確的完成。
在以下情況下web container不能把filter加載到service中:
拋出ServletException異常。
在container定義的時間內(nèi)沒有返回。
void doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)--Filter中的doFilter方法在每次request/response時候會被container調(diào)用,能夠傳遞到doFilter中的request或者response可以傳遞到Filter環(huán)中的下一個環(huán)節(jié)。?此時的Filter在設(shè)計模式中被稱作責(zé)任鏈模式結(jié)構(gòu),這里面抽象處理者的角色就是javax.servlet.Filter這個接口,注冊的所有Filter是具體的處理者,在doFilter方法中實現(xiàn)具體處理邏輯,在這里面責(zé)任鏈?zhǔn)且粭l直線,構(gòu)成這條直線的就是所有注冊的Filter。
destroy--當(dāng)filter從service中移除的時候,container調(diào)用destroy方法,通過調(diào)用這個方法,釋放Filter所占有的系統(tǒng)資源。
如何在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環(huán),container首先處理的是url-patterns,然后才處理servlet-names,所以如果要對filter的執(zhí)行順序有要求,那么在此需要注意。下面我們創(chuàng)建一個web工程,來實踐一下Filter:
web.xml內(nèi)容:
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內(nèi)容:
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內(nèi)容:
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輸出的內(nèi)容:
三月 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方法的輸出,下面創(chuàng)建一個index.html文件,內(nèi)容如下:
1
2
3
4
5
Insert title here6
7
8
9
10
11
12
點擊index.html頁面的按鈕,
此時Console輸出內(nèi)容:
1 EncodeFilter doFilter
每次請求都會有這樣一條輸出。
關(guān)閉tomcat的時候,注意觀察Console輸出的內(nèi)容:
三月 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方法被調(diào)用。Filter的生命周期結(jié)束。這篇文章中包含一些信息,如Server,Service,Container等,可能有些人跟我一樣開始的時候?qū)Υ撕懿涣私?#xff0c;如果這樣大家可以查一下Tomcat等web容器的工作原理,如果有什么地方我說的不清楚,或者有錯誤,那么請?zhí)嵝盐?#xff0c;謝謝。
總結(jié)
以上是生活随笔為你收集整理的java servlet filter_Java Servlet Filter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android java 圆角_java
- 下一篇: python降温了吗_为“Python将