栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

76-filter过滤器--重点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

76-filter过滤器--重点

# 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买了一台联想电脑
免费送货
联想电脑送一个鼠标垫
展示电脑

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873799.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号