# Filter:过滤器
1. 概念:
* 生活中的过滤器:净水器,空气净化器,土匪、
* web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
* 过滤器的作用:拦截请求增强其功能
* 一般用于完成通用的操作。如:登录验证(登陆过才能访问资源,直接访问list.jsp地址如果不登陆的话会拦下来不显示界面而会直接要求登录)、
统一编码处理(post很多地方需要设置编码 把设置编码的任务放在过滤器中来写简化代码)
敏感字符过滤(敏感字符用***表示)
过滤器形象举例:我去外婆家 有一条山路 山路上有好土匪 去的时候说前面要下雨给一把伞增强了功能 回来之后还拦我又增强了功能
注意来回都栏 而且增强功能的含义是什么
注意下面图片中的浏览器 服务器 请求 资源的标注
2. 快速入门:
1. 步骤:
1. 定义一个类,实现接口Filter(类似于实现servlet)
2. 复写方法
3. 配置拦截路径(与servlet不同 servlet配置的是访问路径 filter配置的是拦截路径)
1. web.xml
2. 注解
2. 代码:
package cn.itcat.web.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(" } public void init(FilterConfig config) throws ServletException { } public void destroy() { } }
2. 案例2_敏感词汇过滤
* 需求:
1. 对day17_case案例录入的数据进行敏感词汇过滤
2. 敏感词汇参考《敏感词汇.txt》
3. 如果是敏感词汇,替换为 ***注意这里想一个问题 doFilter()的参数req和resp其实就是浏览器的请求 dofilter放行之后再传下去 到资源
* 分析:
1. 对request对象进行增强。产生一个新的reqquest对象 增强获取参数相关方法
2. 放行。传递新的request对象 传递代理对象代码:
* 增强对象的功能: 注意代理的是对象 增强的也是对象
* 设计模式:一些通用的解决固定问题的方式 --------用设计模式来实现增强对象的功能
1. 装饰模式
2. 代理模式
* 概念:概念举例:好比说我要去买联想电脑,联想的总部在北京厂在北京,联想公司的功能可以生产电脑卖电脑,我作为一个购买者,一种方式去北京买;现在代理商出现了,西安的联想代理商功能是卖电脑,我可以直接在西安的联想代理商用他的卖电脑的功能,但是西安代理是能卖电脑吗其实是北京联想的一个代理对象,我调用的是代理对象,代理对象要调用联想公司的卖电脑功能;我省了事省力
1. 真实对象:被代理的对象------------------------联想北京
2. 代理对象:--------------------------------- --------西安联想代理商
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:两种 静态和动态代理
1. 静态代理:有一个类文件描述代理模式
2. 动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
代码:
注意思考为什么直接代理的测试类 中就有 proxy_lenovo 而没有代理类
因为是在内存中形成代理类而不展示出来
接口:SellComputer package cn.itcat.proxy; public interface SellComputer { public String sell(double money); public void show(); } 真实类 package cn.itcat.proxy; public class Lenovo implements SellComputer { @Override public String sell(double money) { System.out.println("花"+money+"买了一台联想电脑"); return "联想电脑"; } @Override public void show() { System.out.println("展示电脑"); } } ---------------------------------------------------------------------------------- 代理测试类 package cn.itcat.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { //创建真实对象 Lenovo lenovo = new Lenovo(); //2.动态代理来增强lenovo对象 SellComputer proxy_lenovo = (SellComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { //proxy_lenovo就是代理对象 注意但是没有代理类 代理类是直接生成在内存中 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //增强参数: //判断是否是sell方法 if (method.getName().equals("sell")) { //1.增强参数 double money = (double) args[0]; money = money * 0.85; System.out.println("专车接你"); String obj = (String) method.invoke(lenovo, money); System.out.println("免费送货"); return obj+"送一个鼠标垫"; //这里返回的就是lenovo的代理对象proxy_lenovo中的sell();方法的输出 } else { //使用真实对象调用该方法 Object obj = method.invoke(lenovo, args); //这里的前一个参数是真实对象 后一个参数是参数 就是后面.sell中的8000 return obj; } } }); //2.调用方法 String computer = proxy_lenovo.sell(8000); // proxy_lenovo是代理对象代理了对象真实lenono 这里用代理对象调用的方法跟由Lenovo类创建的lenovo真实对象中有的方法一致 System.out.println(computer); proxy_lenovo.show(); //show就是原样调用 } }控制台输出:
专车接你
花6800.0买了一台联想电脑
免费送货
联想电脑送一个鼠标垫
展示电脑



