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

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