Java Web Filter 過濾器進修教程(推舉)。本站提示廣大學習愛好者:(Java Web Filter 過濾器進修教程(推舉))文章只能為提供參考,不一定能成為您想要的結果。以下是Java Web Filter 過濾器進修教程(推舉)正文
1、Filter簡介
Filter也稱之為過濾器,它是Servlet技巧中最沖動人心的技巧,WEB開辟人員經由過程Filter技巧,對web辦事器治理的一切web資本:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等停止攔阻,從而完成一些特別的功效。例照實現URL級其余權限拜訪掌握、過濾敏感辭匯、緊縮呼應信息等一些高等功效。
Servlet API中供給了一個Filter接口,開辟web運用時,假如編寫的Java類完成了這個接口,則把這個java類稱之為過濾器Filter。經由過程Filter技巧,開辟人員可以完成用戶在拜訪某個目的資本之前,對拜訪的要求和呼應停止攔阻,以下所示:
2、Filter是若何完成攔阻的?
Filter接口中有一個doFilter辦法,當我們編寫好Filter,並設置裝備擺設對哪一個web資本停止攔阻後,WEB辦事器每次在挪用web資本的service辦法之前,都邑先挪用一下filter的doFilter辦法,是以,在該辦法內編寫代碼可到達以下目標:
1.挪用目的資本之前,讓一段代碼履行。
2.能否挪用目的資本(等於否讓用戶拜訪web資本)。
3.挪用目的資本以後,讓一段代碼履行。
web辦事器在挪用doFilter辦法時,會傳遞一個filterChain對象出去,filterChain對象是filter接口中最主要的一個對 象,它也供給了一個doFilter辦法,開辟人員可以依據需求決議能否挪用此辦法,挪用該辦法,則web辦事器就會挪用web資本的service方 法,即web資本就會被拜訪,不然web資本不會被拜訪。
3、Filter開辟入門
3.1、Filter開辟步調
Filter開辟分為二個步調:
1.編寫java類完成Filter接口,並完成其doFilter辦法。
2.在 web.xml 文件中應用<filter>和<filter-mapping>元素對編寫的filter類停止注冊,並設置它所能攔阻的資本。
過濾器典范:
package me.gacl.web.filter; 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; /** * @ClassName: FilterDemo * @Description:filter的三種典范運用: * 、可以在filter中依據前提決議能否挪用chain.doFilter(request, response)辦法, * 等於否讓目的資本履行 * 、在讓目的資本履行之前,可以對request\response作預處置,再讓目的資本履行 * 、在目的資本履行以後,可以捕捉目的資本的履行成果,從而完成一些特別的功效 * @author: 孤獨蒼狼 * @date: -- 下晝:: */ public class FilterDemo implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("----過濾器初始化----"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //對request和response停止一些預處置 request.setCharacterEncoding("UTF-"); response.setCharacterEncoding("UTF-"); response.setContentType("text/html;charset=UTF-"); System.out.println("FilterDemo履行前!!!"); chain.doFilter(request, response); //讓目的資本履行,放行 System.out.println("FilterDemo履行後!!!"); } @Override public void destroy() { System.out.println("----過濾器燒毀----"); } }
在web. xml中設置裝備擺設過濾器:
<?xml version="." encoding="UTF-"?> <web-app version="." xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w.org//XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app__.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!--設置裝備擺設過濾器--> <filter> <filter-name>FilterDemo</filter-name> <filter-class>me.gacl.web.filter.FilterDemo</filter-class> </filter> <!--映照過濾器--> <filter-mapping> <filter-name>FilterDemo</filter-name> <!--“/*”表現攔阻一切的要求 --> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.2、Filter鏈
在一個web運用中,可以開辟編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。
web辦事器依據Filter在web.xml文件中的注冊次序,決議先挪用哪一個Filter,當第一個Filter的doFilter辦法被挪用時,web辦事器會創立一個代表Filter鏈的FilterChain對象傳遞給該辦法。在doFilter辦法中,開辟人員假如挪用了FilterChain對象的doFilter辦法,則web辦事器會檢討FilterChain對象中能否還有filter,假如有,則挪用第2個filter,假如沒有,則挪用目的資本。
4、Filter的性命周期
4.1、Filter的創立
Filter的創立和燒毀由WEB辦事器擔任。 web 運用法式啟動時,web 辦事器將創立Filter 的實例對象,並挪用其init辦法,完成對象的初始化功效,從而為後續的用戶要求作好攔阻的預備任務,filter對象只會創立一次,init辦法也只會履行一次。經由過程init辦法的參數,可取得代表以後filter設置裝備擺設信息的FilterConfig對象。
4.2、Filter的燒毀
Web容器挪用destroy辦法燒毀Filter。destroy辦法在Filter的性命周期中僅履行一次。在destroy辦法中,可以釋放過濾器應用的資本。
4.3、FilterConfig接口
用戶在設置裝備擺設filter時,可使用<init-param>為filter設置裝備擺設一些初始化參數,當web容器實例化Filter對象,挪用其init辦法時,會把封裝了filter初始化參數的filterConfig對象傳遞出去。是以開辟人員在編寫filter時,經由過程filterConfig對象的辦法,便可取得:
String getFilterName():獲得filter的稱號。
String getInitParameter(String name): 前往在安排描寫中指命名稱的初始化參數的值。假如不存在前往null.
Enumeration getInitParameterNames():前往過濾器的一切初始化參數的名字的列舉聚集。
public ServletContext getServletContext():前往Servlet高低文對象的援用。
典范:應用FilterConfig獲得filter設置裝備擺設信息
package me.gacl.web.filter; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class FilterDemo implements Filter { /* 過濾器初始化 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("----過濾器初始化----"); /** * <filter> <filter-name>FilterDemo</filter-name> <filter-class>me.gacl.web.filter.FilterDemo</filter-class> <!--設置裝備擺設FilterDemo過濾器的初始化參數--> <init-param> <description>設置裝備擺設FilterDemo過濾器的初始化參數</description> <param-name>name</param-name> <param-value>gacl</param-value> </init-param> <init-param> <description>設置裝備擺設FilterDemo過濾器的初始化參數</description> <param-name>like</param-name> <param-value>java</param-value> </init-param> </filter> <filter-mapping> <filter-name>FilterDemo</filter-name> <!--“/*”表現攔阻一切的要求 --> <url-pattern>/*</url-pattern> </filter-mapping> */ //獲得過濾器的名字 String filterName = filterConfig.getFilterName(); //獲得在web.xml文件中設置裝備擺設的初始化參數 String initParam = filterConfig.getInitParameter("name"); String initParam = filterConfig.getInitParameter("like"); //前往過濾器的一切初始化參數的名字的列舉聚集。 Enumeration<String> initParameterNames = filterConfig.getInitParameterNames(); System.out.println(filterName); System.out.println(initParam); System.out.println(initParam); while (initParameterNames.hasMoreElements()) { String paramName = (String) initParameterNames.nextElement(); System.out.println(paramName); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("FilterDemo履行前!!!"); chain.doFilter(request, response); //讓目的資本履行,放行 System.out.println("FilterDemo履行後!!!"); } @Override public void destroy() { System.out.println("----過濾器燒毀----"); } }
5、Filter的安排
Filter的安排分為兩個步調:
1、注冊Filter
2、映照Filter
5.1、注冊Filter
開辟好Filter以後,須要在web.xml文件中停止注冊,如許能力夠被web辦事器挪用
在web.xml文件中注冊Filter典范:
<filter> <description>FilterDemo過濾器</description> <filter-name>FilterDemo</filter-name> <filter-class>me.gacl.web.filter.FilterDemo</filter-class> <!--設置裝備擺設FilterDemo過濾器的初始化參數--> <init-param> <description>設置裝備擺設FilterDemo過濾器的初始化參數</description> <param-name>name</param-name> <param-value>gacl</param-value> </init-param> <init-param> <description>設置裝備擺設FilterDemo過濾器的初始化參數</description> <param-name>like</param-name> <param-value>java</param-value> </init-param> </filter>
<description>用於添加描寫信息,該元素的內容可為空,<description>可以不設置裝備擺設。
<filter-name>用於為過濾器指定一個名字,該元素的內容不克不及為空。
<filter-class>元素用於指定過濾器的完全的限制類名。
<init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可使用FilterConfig接口對象來拜訪初始化參數。假如過濾器不須要指定初始化參數,那末<init-param>元素可以不設置裝備擺設。
5.2、映照Filter
在web.xml文件中注冊了Filter以後,還要在web.xml文件中映照Filter
<!--映照過濾器--> <filter-mapping> <filter-name>FilterDemo</filter-name> <!--“/*”表現攔阻一切的要求 --> <url-pattern>/*</url-pattern> </filter-mapping>
<filter-mapping>元素用於設置一個 Filter 所擔任攔阻的資本。一個Filter攔阻的資本可經由過程兩種方法來指定:Servlet 稱號和資本拜訪的要求途徑
<filter-name>子元素用於設置filter的注冊稱號。該值必需是在<filter>元素中聲明過的過濾器的名字
<url-pattern>設置 filter 所攔阻的要求途徑(過濾器聯系關系的URL款式)
<servlet-name>指定過濾器所攔阻的Servlet稱號。
<dispatcher>指定過濾器所攔阻的資本被 Servlet 容器挪用的方法,可所以REQUEST,INCLUDE,FORWARD和ERROR之一,默許REQUEST。用戶可以設置多個<dispatcher> 子元素用來指定
Filter 對資本的多種挪用方法停止攔阻。以下:
<filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/index.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
<dispatcher> 子元素可以設置的值及其意義:
1.REQUEST:當用戶直接拜訪頁面時,Web容器將會挪用過濾器。假如目的資本是經由過程RequestDispatcher的include()或forward()辦法拜訪時,那末該過濾器就不會被挪用。
2.INCLUDE:假如目的資本是經由過程RequestDispatcher的include()辦法拜訪時,那末該過濾器將被挪用。除此以外,該過濾器不會被挪用。
3.FORWARD:假如目的資本是經由過程RequestDispatcher的forward()辦法拜訪時,那末該過濾器將被挪用,除此以外,該過濾器不會被挪用。
4.ERROR:假如目的資本是經由過程聲明式異常處置機制挪用時,那末該過濾器將被挪用。除此以外,過濾器不會被挪用。