Javaweb-Filter-1-快速入門

2021-01-08 凱哥Java

Filter快速入門

開始學習Filter這個知識點,單詞是過濾器和攔截器的作用。Filter是Javaweb中的過濾器,可以攔截所有訪問web資源的請求或響應操作。Filter這個知識點很重要,在javaweb開發中,這個是我們需要重點掌握的一個知識點。

1.使用場景

使用Filter主要場景是攔截判斷是否登錄,權限管理,例如不同角色權限是不同,請求在這個角色之外的操作會被攔截。還有一個使用場景就是全局給項目中全部servlet都設置UTF-8編碼,防止中文亂碼的情況。

這裡,我們來看線上產品,某一家公司的登錄攔截,使用了Filter,我們看看效果。

瀏覽器打開

點擊上圖中,紅圈的結構式檢索,看看登錄攔截效果。

立馬就讓你去登錄,這個就是一個典型的使用Filter的場景。

這裡簡單來分析一下這個攔截過程:

1) 用戶沒有登錄,點擊結構式檢索這個請求

2) 這個請求發送到伺服器上對應的Servlet處理之前被Filter給攔截了

3) 在Filter中代碼先從session中取出用戶數據,看看用戶是否存在

4) 如果用戶是null,說明沒有登錄,需要攔截

5) 如果用戶是資料庫中存在用戶,放開攔截,讓請求繼續下去

下面,我們來一個Filter快速入門的練習,體會一下這個攔截和放行的過程。

2.Filter快速入門步驟

1)創建一個類實現Filter接口

2)重寫接口中方法,doFilter方法是真正過濾的。

3)在web.xml文件中配置

在Filter的doFilter方法內如果沒有執行chain.doFilter(request,response),那麼資源是不會被訪問到的。

3.Filter入門練習

創建一個web項目

新建一個Servlet類,待會要用,模擬我們的上面這個結構式檢索對應的Servlet。

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("ServletDemo1運行了");

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

新建一個Filter類,實現Filter接口

重寫doFilter方法

package com.kaigejava.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;

public class MyFilter implements Filter {

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

System.out.println("doFilter執行了");

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

}

編輯web.xml,添加filter配置

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

<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>FilterDemo</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>MyFilter</filter-name>

<filter-class>com.anthony.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>MyFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<description></description>

<display-name>ServletDemo1</display-name>

<servlet-name>ServletDemo1</servlet-name>

<servlet-class>com.anthony.servlet.ServletDemo1</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ServletDemo1</servlet-name>

<url-pattern>/servletDemo1</url-pattern>

</servlet-mapping>

</web-app>

運行測試一下

添加到tomcat伺服器管理,啟動服務,瀏覽器訪問下

發現只在控制臺輸出「doFilter執行了「,並沒有執行/servlet/Demo1中的列印語句,這是為什麼呢?

這裡解釋下,我們當前代碼只做了攔截,請求無法往下走,所以servlet中的列印語句沒有輸出,這個時候,如果想要輸出列印語句,就需要放行攔截。具體代碼如下。

package com.kaigjava.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;

public class MyFilter implements Filter {

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

System.out.println("doFilter執行了");

// 放行

chain.doFilter(request, response);

}

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

}

注意上面chain.doFilter(request, response)這行代碼,如果不寫這行,就一直攔截,請求沒法往下走。這個就像我們上面登錄驗證攔截一樣,沒有登錄就沒有放開攔截。

繼續部署上面代碼,再來訪問測試下,控制臺輸出如下內容。

doFilter執行了

ServletDemo1運行了

4.FilterChain

上面我們在web.xml中配置的Filter中過濾url設置是/*,也就是全部請求都進行攔截。在代碼放行中,出現了FilterChain對象,這裡我們簡單來了解下這個過濾鏈對象。

FilterChain是servlet容器為開發任意提供的對象,它提供了對某一資源的已經過濾請求調用鏈的視圖。過濾器使用FilterChain調用鏈中的下一個過濾器。如果調用的過濾器是鏈中的最後一個過濾器,則調用鏈末尾的資源。

怎麼可以形成一個Filter鏈?只要多個Filter對同一個資源進行攔截就可以形成Filter鏈?

怎麼確定Filter的執行順序?由<filter-mapping>中不同Filter寫的先後順序來決定。

這個過濾鏈中不同的Filter過濾先後順序取決於,開發人員在web.xml中的<filter-mapping>寫的先後順序來決定,上面這個圖就是先執行MyFilter這個過濾器,然後再執行MyFilter2這個過濾器.

總結,Filter就處於瀏覽器和伺服器中間的位置,可以攔截任何來自瀏覽器的請求和任意來之伺服器的響應。

相關焦點

  • 黑馬程式設計師:Javaweb應用中filter的執行順序解密
    1.引言我們在編寫javaweb程序的時候,時常會用filter這個組件,它能將我們一些通用邏輯抽取出來,在servlet執行業務邏輯之前運行,達到簡化代碼和復用的目的.比如最常用的場景全站編碼和登錄驗證功能.
  • JavaWeb - Filter 和 Listener
    <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.renda.LoginFilter</filter-class></filter> <filter-mapping> <filter-name
  • 學習JavaWeb這一篇就夠了 Filter (6/8)
    學習JavaWeb這一篇就夠了,從入門到精通,由淺至深,共八章,此篇為第六章。附帶安裝包下載。配套資料,免費下載連結:https://pan.baidu.com/s/1G1YUANaBvGjzE-c-Z0xUWw提取碼:txnf6.1、Filter
  • javaweb學習之過濾器(Filter)的使用
    使用步驟新建一個類,實現Filter接口重寫三個方法在web.xml中註冊(或使用註解)需要重寫的三個方法的作用:void init(FilterConfig var1) throws ServletException; //過濾器初始化,在伺服器啟動時就自動執行了。
  • Java Web之Filter學習筆記
    今天要學習的是關於Filter的內容,主要包括Filter的概念、快速入門、代碼演示、過濾器細節,對Filter有學習需要的小夥伴可以在看完本文後,再把文章收藏起來以便於以後的複習,現在一起來看看Java Web之Filter的學習筆記吧~
  • Javaweb之Filter案例練習-項目全局編碼過濾器
    xml version="1.0" encoding="UTF-8"?><filter-name>MyFilter</filter-name><filter-class>com.kaigejava.web.filter.MyFilter</filter-class></filter><filter-mapping><
  • Python零基礎入門教程,如何使用lambda、filter和map函數?
    大綱函數類型定義及特性lambda函數定義及使用filter函數定義及使用map函數定義及使用引入函數類型概念函數類型定義:python中任意一個函數都有數據類型,這種數據類型是function(函數類型)
  • 快速入門ElasticSearch(下)
    神奇的事情發生了,居然把所有包含Java或者入門的文檔都給查詢出來了,其實這就是模糊查詢的弊端,也就是說此時"Java入門"這一詞語被拆分為"Java"和"入門"這兩個詞語,然後再進行模糊查詢,而我們實際上想查詢的則是"Java
  • Nginx 源碼分析之 Filter 模塊(1)
    1.閱讀本文前可以看看前面的文章作為參考。Filter 模塊過濾(filter)模塊是過濾響應頭和內容的模塊,可以對回復的頭和內容進行處理。它的處理時間在獲取回復內容之後,向用戶發送響應之前。當編譯進一個 filter 模塊的時候,就被賦值為當前 filter 模塊的處理函數。而 ngx_http_next_header_filter 是一個局部全局變量,它保存了編譯前上一個 filter 模塊的處理函數。所以整體看來,就像用全局變量組成的一條單向鍊表。
  • JavaScript中filter如何使用?filter使用方法
    filter是一種在特定條件下縮小數組內容的方法,它用於在回調函數指定的條件下判斷單個元素,並僅檢索與條件匹配的元素,所以,本篇文章我們就來具體看看JavaScript中filter過濾器的使用方法。我們先來看一下filter的基本語法使用filter時,請指定數組的filter方法。array.filter(callback [,that]);對於array,需要指定預先創建的數組對象。對於回調,可以指定數組元素的值「value」,數組元素的數字索引「index」以及存儲數組元素的數組對象「arrayObj」。
  • Python編程技巧:如何用Map, Filter, Reduce代替For循環?
    for 循環就像是一把瑞士軍刀,它可以解決很多問題,但是,當你需要掃視代碼,快速搞清楚代碼所做的事情時,它們可能會讓人不知所措。map、filter 和 reduce 這三種技術可以提供描述迭代原因的函數替代方案,以便避免過多的 for 循環。我之前在 JavaScript 中寫過這些技術的入門文章,但是它們在 Python 中的實現略有不同。
  • 一步步教你開發一個JavaWeb項目(新手必看)
    `home` varchar(255) NOT NULL, `info` varchar(255) NOT NULL, PRIMARYKEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERTINTO `user` VALUES ('1'
  • Spark 1.6.0 新手快速入門
    操作返回了一個新的RDD,該RDD為文件中數據項的子集,該子集符合過濾條件: scala> val linesWithSpark = textFile.filter(line => line.contains("Spark")) linesWithSpark: spark.RDD[String] = spark.FilteredRDD@7dd4af09
  • Golang「驅動」MongoDB-快速入門(「快碼加鞭」)
    背景: 2019年3月,MongoDB官方Golang驅動已經正式發布V1.0.0 GA版本(GenerallyAvailable),本篇為MongoDB-Go驅動快速入門代碼示例,包含以下主要內容:MongoDB Go驅動安裝
  • Javaweb之Filter案例練習-自動登錄問題和MD5加密
    package com.kaigejava.web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import
  • QtConcurrent之filter函數的使用
    filter是過濾的意思,QtConcurrent::filter函數就是用來實現並行過濾的。filter和map函數的使用方式是一樣的,分為filter、filtered和filteredReduced三個函數。1.filter函數過濾一個序列,該序列的內容被修改。
  • leveldb筆記之7:filter block
    1. 簡介leveldb 裡 sstable 文件裡,有多個 block 組成。其中 filter block 用於提高 sstable 的讀取效率,源碼位於 filter_block.cc.GenerateFilter主要是更新result_和filter_offsets_,即數據格式裡的1 2部分。
  • Spring Cloud服務網關 zuul 快速入門
    前言:上篇博客中,我們快速搭建了一個Spring Cloud微服務的dome,那麼這個博客就是在哪個dome的基礎上開始講解一下服務網關zuul的使用,zuul的作用我在我的前面博客中也有提到,這裡就不多說。
  • 學習JavaWeb這一篇就夠了 Servlet3 (8/8)
    學習JavaWeb這一篇就夠了,從入門到精通,由淺至深,共八章,此篇為第八章第3小節。附帶安裝包下載。配套資料,免費下載連結:https://pan.baidu.com/s/1G1YUANaBvGjzE-c-Z0xUWw提取碼:txnf
  • Cloud-Gateway之GlobalFilter
    @6db04a6: -1000,org.iblog.enhance.gateway.filter.convert.ConvertRequestBodyFilter@1bba9862: -900,org.iblog.enhance.gateway.filter.extract.ExtractRequestBodyFilter@565c887e: -800,