程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Web Filter 過濾器進修教程(推舉)

Java Web Filter 過濾器進修教程(推舉)

編輯:關於JAVA

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:假如目的資本是經由過程聲明式異常處置機制挪用時,那末該過濾器將被挪用。除此以外,過濾器不會被挪用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved