24.【Filter:过滤器】

概念

  • 生活中的过滤器:净水器,空气净化器,土匪、
  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

过滤器的作用

  • 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…

步骤

  1. 定义一个类,实现接口Filter
  2. 复写方法
  3. 配置拦截路径
  • web.xml
  • 注解

生命周期

  1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源

  2. doFilter:每一次请求被拦截资源时,会执行。执行多次

  3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

代码:

package cn.luis.web.filter;

import javax.servlet.*;
import java.io.IOException;

/*@WebFilter("/*")*/
public class FilterDemo3 implements Filter {

    /**
     * 每一次请求被拦截资源时,会执行。执行多次
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("doFilter....");
        chain.doFilter(req, resp);
    }

    /**
     * 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
     * @param config
     * @throws ServletException
     */
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init....");
    }

    /**
     * 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
     */
    public void destroy() {
        System.out.println("destroy....");
    }

}

拦截路径配置

注解配置

1. 具体资源路径/index.jsp 【只有访问index.jsp资源时,过滤器才会被执行】

@WebFilter("/index.jsp")

2. 拦截目录/user/* 【/user是url地址】

@WebFilter(" /user/*")	

访问/user下的所有资源时,过滤器都会被执行

如:http://localhost:8080/13_Filter_Listener/user/findAllServlet

3. 后缀名拦截*.jsp 【访问所有后缀名为jsp资源时,过滤器都会被执行】

@WebFilter("*.jsp")

4. 拦截所有资源/* 【访问所有资源时,过滤器都会被执行】

@WebFilter("/*")        

web.xml配置

    <filter>
       <filter-name>demo1</filter-name>
       <filter-class>cn.luis.web.filter.FilterDemo1</filter-class>
    </filter>

   <filter-mapping>
      <filter-name>demo1</filter-name>
       <!--拦截路径配置-->
      <url-pattern>/*</url-pattern>
       <!--拦截方式配置-->
      <dispatcher>REQUEST</dispatcher>
   </filter-mapping>

拦截方式配置

资源被访问的方式

注解配置

设置dispatcherTypes属性

  • REQUEST:默认值。浏览器直接请求资源
  • FORWARD:转发访问资源
  • INCLUDE:包含访问资源
  • ERROR:错误跳转资源
  • ASYNC:异步访问资源

代码:

  1. 浏览器直接请求index.jsp资源时,该过滤器会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
  1. 只有转发访问index.jsp时,该过滤器才会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
  1. 浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
@WebFilter(value="/*",dispatcherTypes ={DispatcherType.FORWARD,
                                        DispatcherType.REQUEST})

访问http://localhost:8080/13_Filter_Listener/user/updateServlet时会执行两次过滤器

web.xml配置

设置<dispatcher></dispatcher>标签即可

代码见上面!‘

执行流程

  1. 执行过滤器
  2. 执行放行后的资源
  3. 回来执行过滤器放行代码下边的代码

过滤器链

配置多个过滤器

执行顺序:如果有两个过滤器

  • 过滤器1
  • 过滤器2
  • 资源执行
  • 过滤器2
  • 过滤器1

过滤器先后顺序问题

注解配置

按照类名的字符串比较规则比较,值小的先执行

  • 如:AFilterBFilterAFilter就先执行了。
web.xml配置

<filter-mapping>谁定义在上边,谁先执行

增强对象的功能

设计模式:一些通用的解决固定问题的方式

  1. 装饰模式
  2. 代理模式

代理模式

概念
  • 真实对象:被代理的对象
  • 代理对象:
  • 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的

实现方式

  1. 静态代理:有一个类文件描述代理模式
  2. 动态代理:在内存中形成代理类

动态代理实现步骤

  1. 代理对象和真实对象实现相同的接口
  2. 代理对象 :Proxy.newProxyInstance();
  3. 使用代理对象调用方法。
  4. 增强方法

方法的增强方式

  1. 增强参数列表
  2. 增强返回值类型
  3. 增强方法体执行逻辑

代码:

真实类

package cn.luis.web.proxy;

/**
 * @ClassName Lenovo
 * @Description 真实类
 * @Author L
 * @Date 2020.02.16 11:22
 * @Version 1.0
 * @Remark TODO
 **/
public class Lenovo implements SaleComputer {
    @Override
    public String sale(double money) {
        System.out.println("花了"+ money +"买了台联想电脑...");
        return "联想电脑";
    }

    @Override
    public void show() {
        System.out.println("展示电脑...");
    }
}

接口

package cn.luis.web.proxy;

public interface SaleComputer {

    public String sale(double money);

    public void show();
}

代理对象

package cn.luis.web.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName ProxyTest
 * @Description TODO
 * @Author L
 * @Date 2020.02.16 11:25
 * @Version 1.0
 * @Remark TODO
 **/
public class ProxyTest {
    public static void main(String[] args) {
        // 创建真实对象
        Lenovo lenovo = new Lenovo();

        /*
            三个参数:
                1. 类加载器:真实对象.getClass().getClassLoader()
                2. 接口数组:真实对象.getClass().getInterfaces()
                3. 处理器:new InvocationHandler()
         */
        // 动态代理增强Lenovo对象
        SaleComputer proxyLenovo = (SaleComputer) Proxy.newProxyInstance(
            lenovo.getClass().getClassLoader(), 
            lenovo.getClass().getInterfaces(), 
            new InvocationHandler() {
            /*
                代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
                    参数:
                        1. proxy:代理对象
                        2. method:代理对象调用的方法,被封装为的对象
                        3. args:代理对象调用的方法时,传递的实际参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /*System.out.println(method.getName());
                System.out.println(args[0]);*/

               // 判断是否为sale方法
                if(method.getName().equals("sale")) {
                    // 1.增强参数
                    double money = (double) args[0];
                    money = money * 0.85;
                    // 使用真实对象调用该方法
                    String obj = (String) method.invoke(lenovo,money);
                    // 2.增强方法体
                    System.out.println("免费送货...");
                    // 3.增强返回值
                    return obj + " + 键鼠套装";
                } else {
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }
            }
        });

        // 调用方法1
        /*String computer = proxyLenovo.sale(8888);
        System.out.println(computer);*/
		// 调用方法2
        proxyLenovo.show();
    }
}

结果:

// 调用方法1
花了7554.8买了台联想电脑...
免费送货...
联想电脑 + 键鼠套装

// 调用方法2
展示电脑...
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值