Filter過濾器和動態代理處理機制和案例(Filter過濾器和動態代理結合)

一、學習心得:

  1. Filter過濾器,它的處理機制,就是把數據傳到implements Filter實現Filter類中,有三個方法,第一個方法init(FilterConfig filterConfig)相當於預處理,把預處理的結果返回給一個集合等存貯起來;第二個方法doFilter(final ServletRequest request, ServletResponse response, FilterChain filterChain)
    就是將預處理完的結果拿出來配合動態代理來進行二次處理並得出最終結果;第三個方法destroy()目的在於,等服務器關閉後,做最後的關閉,銷燬,清理等釋放資源工作;運用它的核心是:讓我們的業務層能夠和Dao層之間分開,或者說,Filter過濾器它是一種,可以讓每一個頁面傳遞的數據進行處理的機制,就代表它可以處理一類,我們從進入頁面開始比較常態的傳遞數據的過濾;例如:登錄驗證,統一字符編碼,敏感詞彙(罵人詞語進行轉化)等;

二、Filter過濾器處理機制和介紹

1、Filter過濾器簡介:

在這裏插入圖片描述

2. Filter過濾器的圖示機制(方便記憶):

圖文解釋:當我們瀏覽器的發出請求,它可以在Filter類中進行配置@WebFilter("/*")或者在配置文件裏面寫,作用就是將每一個請求都要經過過濾器,然後,才能訪問我們的內部後臺數據;而每一次經過過濾器,你都要留下數據交給過濾器,過濾器,進行請求和增強(放行),後臺數據開始調用,等後臺數據調用完之後,再通過過濾器,進行相應增強,再返回給界面;
在這裏插入圖片描述

3. 這裏的第二點和第三點便是它的處理機制

在這裏插入圖片描述

4. 案例代碼操作:

4.1 第一步:FilterDemo.class

package com.jiqi.Web;

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.annotation.WebFilter;
@WebFilter("/*")
public class Fiter_test1 implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("進來了放行的上面");
		chain.doFilter(request, response);
		System.out.println("進行數據運行之後,再進來了放行的下面");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

4.2第二步:index.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>第一個Demo</title>
</head>
<body>
<p>過濾器進來了</p>
<%System.out.println("進來頁面了"); %>

</body>
</html>

4.3 點擊運行jsp文件 結果:

進來了放行的上面
進來頁面了
進行數據運行之後,再進來了放行的下面

5. doFilter方法,主要的目的在於:增強作用:增強請求數據、響應數據;

在這裏插入圖片描述

三、Filter過濾器配置文件和介紹

1. 配置攔截訪問路徑:

第一種:@WebFilter("/*") 表示爲:任何請求數據都會被攔截,經過Filter過濾器;
第二種:web.xml配置:下面圖片的第一點
在這裏插入圖片描述

2. 過濾器配置詳解:

注意下面的第四點:攔截路徑解釋和資源訪問的方式在這裏插入圖片描述

3. 過濾器鏈(配置多個過濾器)

這裏特別注意多個過濾器的執行順序是由你的類命名字符串規則來比較並執行;值小的先執行;
在這裏插入圖片描述

四、動態代理詳解和案例需求Filter過濾器和動態代理結合

1、動態代理的處理機制、創建和參數說明、如何調用和增強、案例需求代理模式和方式;

(1)動態代理的處理機制:

圖片理解爲:在我們現實生活當中:我們需要便捷的生活方式,相對應於的就必須要有相對應的機構來協調和處理;就和現在微商,總公司和代理之間的構建,它的目的在於代理能夠更好的處理線下客戶和更精準的一對一服務並完成高質量的工作;動態代理就是這般處理機制;就和下面賣電腦一樣,代理賣電腦,代理商,可以更精準的服務於大衆實現高精準;

(2)動態代理的創建和參數說明:

以下圖片,特別注意我們真實對象和代理對象的劃分:我們傳遞真實對象到Proxy代理方法當中,返回的是我們的代理對象,代理對象再進行處理邏輯;
在這裏插入圖片描述
這裏特別注意:代理對象處理邏輯的三個參數說明;
在這裏插入圖片描述

(3)如何調用和增強:

以下圖片說明:如何使用代理對象中的參數,並執行代理方法;
特別說明的是:代理對象是接口,真實對象是實現代理對象接口;
在下面代理邏輯編寫方法invoke()中,當我們執行method.invoke(真實對象,代理對象傳遞的參數)代理對象.方法(代理對象傳遞的參數)這兩個方法返回的數據,都是一一對應的;在生活中的例子解釋:即代理商賣電腦,它不具備賣電腦的方法,它是調用公司總部賣電腦的方法,然後,代理商它傳遞參數,告訴公司,賣什麼電腦等訊息,再得到總公司的返回結果,同時,代理商也接收到結果,並進行反饋;
在這裏插入圖片描述
以下圖片,是爲代理對象,進行增強方法;就是類似代理商賺差價之後,給你送鼠標和鍵盤;
在這裏插入圖片描述

(4)案例需求代理模式和方式:

4.1查看案例需求和步驟:

在這裏插入圖片描述

4.2 查看案例需要的類和文件:

在這裏插入圖片描述

4.3導入敏感詞彙的txt文件;

在這裏插入圖片描述

4.4寫servlet代碼:

詳細代碼如下:

package com.jiqi.Web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/testservlet")
public class Servlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		   request.setCharacterEncoding("UTF-8");
		/* String name = request.getParameter("劉奇");只能用傳遞值,不能直接寫參數,這裏用法錯誤 */
		   /* String name = request.getParameter("name");正確*/
		   
		/*
		 * http://localhost:8080/day4_15case/testservlet?name=%22liuq%22&msg=%22%E5%A4%
		 * A7%E7%AC%A8%E8%9B%8B%22
		 * 這裏寫法,必須注意,必須都是英文書寫,特別是問號,還有所有參數都要精密相連
		 */	        String name = request.getParameter("name");
	        String massage = request.getParameter("msg");
	        System.out.println(name+":"+massage);
	        
	      
	        
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
	}

	
}

4.5寫動態代理和Filter過濾器代碼:

package com.jiqi.Web;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;

@WebFilter("/*")
public class DoFilter implements Filter{
	public static List<String> list= new ArrayList<>();//敏感詞彙集合
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		try {
//			1\獲取敏感詞彙文件的真實路徑
			ServletContext servletContext = filterConfig.getServletContext();
			String realPath =servletContext.getRealPath("/WEB-INF/classes/敏感詞彙.txt");//根據相對路徑獲取服務器上資源的絕對路徑
			/* 2\讀取文件; */
			BufferedReader bufferedReader = new BufferedReader(new FileReader(realPath));
			String line = null;
			while((line=bufferedReader.readLine()) != null) {
				list.add(line);
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/* 3、將文件的每一行都加入到敏感集合中去; */ catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO Auto-generated method stub
				if(method.getName().equals("getParameter")) {
					String value = (String)method.invoke(request, args);
					System.out.println("初始值:"+value);
					if(value != null) {
						for (String text : list) {
							if(value.contains(text)) {
								 value = value.replaceAll(text, "***");
								 System.out.println("替換值:"+value);
							}
						}
					}
					
					return value;
				}
				return method.invoke(request, args);
				
				
			}
		});
		
		chain.doFilter(proxy_req, response);
		
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("over 收工了");
	}
	
	
}

如有不懂可以加我並練習哦;
個人也有免費大學生畢業網站和答辯項目總集;
並提供免費軟件和教學視頻;
QQ+2545062785

以上總結,當採納和對你有幫助時;
🤞👣👀👇🤝🙌🍗
留下你的點贊足跡+你愛心的評論哦!
🉐(⓿_⓿)謝啦!!☆⌒(*^-゜)v

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章