国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - Java教程 - 淺談Java中的Filter過濾器

淺談Java中的Filter過濾器

2020-08-13 11:46coderland Java教程

本篇文章主要介紹了淺談Java中的Filter過濾器,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Filter簡介

Filter也稱之為過濾器,它是Servlet技術中最實用的技術,Web開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。

它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理。使用Filter的完整流程:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。

Filter功能

在HttpServletRequest到達 Servlet 之前,攔截客戶的HttpServletRequest 。根據需要檢查HttpServletRequest,也可以修改HttpServletRequest 頭和數據。

在HttpServletResponse到達客戶端之前,攔截HttpServletResponse 。根據需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數據。

如何借助Filter實現攔截功能

Filter接口中有一個doFilter方法,當開發人員編寫好Filter,并配置對哪個web資源進行攔截后,Web服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可達到如下目的:

調用目標資源之前,讓一段代碼執行。

是否調用目標資源(即是否讓用戶訪問web資源)。

web服務器在調用doFilter方法時,會傳遞一個filterChain對象進來,filterChain對象是filter接口中最重要的一個對象,它也提供了一個doFilter方法,開發人員可以根據需求決定是否調用此方法,調用該方法,則web服務器就會調用web資源的service方法,即web資源就會被訪問,否則web資源不會被訪問。

Filter開發兩步走

編寫java類實現Filter接口,并實現其doFilter方法。

 在web.xml文件中對編寫的filter類進行注冊,并設置它所能攔截的資源。

web.xml配置各節點介紹:

  • <filter>指定一個過濾器。
  • <filter-name>用于為過濾器指定一個名字,該元素的內容不能為空。
  • <filter-class>元素用于指定過濾器的完整的限定類名。
  • <init-param>元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
  • 在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
  • <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 對資源的多種調用方式進行攔截。
  • <dispatcher>子元素可以設置的值及其意義
  • REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那么該過濾器就不會被調用。
  • INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。
  • FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾器將被調用,除此之外,該過濾器不會被調用。
  • ERROR:如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。

Filter鏈

在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。

web服務器根據Filter在web.xml文件中的注冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。

Filter的生命周期

?
1
public void init(FilterConfig filterConfig) throws ServletException;//初始化

和我們編寫的Servlet程序一樣,Filter的創建和銷毀由WEB服務器負責。 web 應用程序啟動時,web 服務器將創建Filter 的實例對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而為后續的用戶請求作好攔截的準備工作(filter對象只會創建一次,init方法也只會執行一次)。開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。

 

復制代碼 代碼如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//攔截請求

 

這個方法完成實際的過濾操作。當客戶請求訪問與過濾器關聯的URL的時候,Servlet過濾器將先執行doFilter方法。FilterChain參數用于訪問后續過濾器。

?
1
public void destroy();//銷毀

Filter對象創建后會駐留在內存,當web應用移除或服務器停止時才銷毀。在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。

FilterConfig接口

用戶在配置filter時,可以使用為filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得以下內容:

?
1
2
3
4
String getFilterName();//得到filter的名稱。
String getInitParameter(String name);//返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
Enumeration getInitParameterNames();//返回過濾器的所有初始化參數的名字的枚舉集合。
public ServletContext getServletContext();//返回Servlet上下文對象的引用。

Filter使用案例

使用Filter驗證用戶登錄安全控制

前段時間參與維護一個項目,用戶退出系統后,再去地址欄訪問歷史,根據url,仍然能夠進入系統響應頁面。我去檢查一下發現對請求未進行過濾驗證用戶登錄。添加一個filter搞定問題!

先在web.xml配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<filter>
  <filter-name>SessionFilter</filter-name>
  <filter-class>com.action.login.SessionFilter</filter-class>
  <init-param>
    <param-name>logonStrings</param-name><!-- 對登錄頁面不進行過濾 -->
    <param-value>/project/index.jsp;login.do</param-value>
  </init-param>
  <init-param>
    <param-name>includeStrings</param-name><!-- 只對指定過濾參數后綴進行過濾 -->
    <param-value>.do;.jsp</param-value>
  </init-param>
  <init-param>
    <param-name>redirectPath</param-name><!-- 未通過跳轉到登錄界面 -->
    <param-value>/index.jsp</param-value>
  </init-param>
  <init-param>
    <param-name>disabletestfilter</param-name><!-- Y:過濾無效 -->
    <param-value>N</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SessionFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

接著編寫FilterServlet

?
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.action.login;
 
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
 
/**
 *  判斷用戶是否登錄,未登錄則退出系統
 */
public class SessionFilter implements Filter {
 
  public FilterConfig config;
 
  public void destroy() {
    this.config = null;
  }
 
  public static boolean isContains(String container, String[] regx) {
    boolean result = false;
 
    for (int i = 0; i < regx.length; i++) {
      if (container.indexOf(regx[i]) != -1) {
        return true;
      }
    }
    return result;
  }
 
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest hrequest = (HttpServletRequest)request;
    HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
 
    String logonStrings = config.getInitParameter("logonStrings");    // 登錄登陸頁面
    String includeStrings = config.getInitParameter("includeStrings");  // 過濾資源后綴參數
    String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 沒有登陸轉向頁面
    String disabletestfilter = config.getInitParameter("disabletestfilter");// 過濾器是否有效
 
    if (disabletestfilter.toUpperCase().equals("Y")) {  // 過濾無效
      chain.doFilter(request, response);
      return;
    }
    String[] logonList = logonStrings.split(";");
    String[] includeList = includeStrings.split(";");
 
    if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 只對指定過濾參數后綴進行過濾
      chain.doFilter(request, response);
      return;
    }
 
    if (this.isContains(hrequest.getRequestURI(), logonList)) {// 對登錄頁面不進行過濾
      chain.doFilter(request, response);
      return;
    }
 
    String user = ( String ) hrequest.getSession().getAttribute("useronly");//判斷用戶是否登錄
    if (user == null) {
      wrapper.sendRedirect(redirectPath);
      return;
    }else {
      chain.doFilter(request, response);
      return;
    }
  }
 
  public void init(FilterConfig filterConfig) throws ServletException {
    config = filterConfig;
  }
}

這樣既可完成對用戶所有請求,均要經過這個Filter進行驗證用戶登錄。

防止中文亂碼過濾器

項目使用spring框架時。當前臺JSP頁面和Java代碼中使用了不同的字符集進行編碼的時候就會出現表單提交的數據或者上傳/下載中文名稱文件出現亂碼的問題,那就可以使用這個過濾器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name><!--用來指定一個具體的字符集-->
    <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name><!--true:無論request是否指定了字符集,都是用encoding;false:如果request已指定一個字符集,則不使用encoding-->
    <param-value>false</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

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

原文鏈接:http://www.cnblogs.com/coderland/p/5902878.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 求av网址| 极品女神高潮呻吟av久久 | 亚洲精品一区二区 | 中文字幕人成乱码在线观看 | 中文字幕成人在线 | 欧美精品一区二区三区蜜桃视频 | 黄色国产电影 | 日韩精品一区二区在线观看 | 欧美日韩成人影院 | www.伊人网| 亚洲专区 中文字幕 | 久久精品国产清自在天天线 | 综合色爱 | av一区二区在线观看 | 亚洲播放| 四影虎影ww4hu55.com | 九九亚洲 | 午夜精品在线 | 欧美午夜在线观看 | 欧洲精品在线观看 | 在线精品一区 | 国产中文字幕一区 | 久久99久久99精品免观看粉嫩 | 高清在线一区二区 | 国产高清在线不卡 | 国产精品久久久久久久久久新婚 | 国产精品成av人在线视午夜片 | 国产精品影视在线观看 | 污片网站 | 国产一区二 | 成人免费crm在线观看 | 欧美精品v国产精品v日韩精品 | 欧美 日韩 中文 | 国产一区二区三区久久 | 一区二区自拍 | 免费观看一级淫片 | 国产精品国产三级国产aⅴ中文 | 九色在线 | 国产亚洲精品精品国产亚洲综合 | 免费午夜在线视频 | 成人a在线视频免费观看 |