javax.servlet.Filter与动态代理
侧边栏壁纸
  • 累计撰写 61 篇文章
  • 累计收到 18 条评论

javax.servlet.Filter与动态代理

龙流
2022-03-25 / 0 评论 / 66 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年03月26日,已超过761天没有更新,若内容或图片失效,请留言反馈。

Java过滤器 Fileter

快速入门:

1、定义一个类,实现**javax.servlet.Filter**接口
2、重写其3个方法,init(); doFilter(); destroy();
3、配置拦截资源:
    通过web.xml配置
    注解配置 @WebFilter("urlPatterns")

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

          <filter>
              <filter-name>demo1</filter-name>
              <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>demo1</filter-name>
              <!-- 拦截路径 -->
              <url-pattern>/*</url-pattern>
          </filter-mapping>
    
</web-app>

Filter实现代码

public class FilterDemo implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
        
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了....");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {}
}

过来器生命周期

1、init()方法,会在Filter对象创建时执行一次。一般可以用来加载资源
2、doFilter()方法,会执行多次,符合拦截规则的请求,在请求到资源前都会执行该方法,filterChain.doFilter(servletRequest,servletResponse)放行,拿到资源后,即进行响应时会走放行后的代码
3、destroy()方法,会在Filter对象被正常消耗时会执行一次。

过滤器链(配置多个过滤器)

    * 执行顺序:如果有两个过滤器:过滤器1和过滤器2
        1. 过滤器1
        2. 过滤器2
        3. 资源执行
        4. 过滤器2
        5. 过滤器1 

    * 过滤器先后顺序问题:
        1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
            * 如: AFilter 和 BFilter,AFilter就先执行了。
        2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行

使用动态代理增强Filter过滤器中的doFilter(servletRequest,servletResponse)方法的servletRequest对象的getParameter()方法

动态代理

            * 概念:
                1. 真实对象:被代理的对象
                2. 代理对象:
                3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
             * 实现方式:
                 1. 静态代理:有一个类文件描述代理模式
                 2. 动态代理:在内存中形成代理类
                    * 实现步骤:
                        1. 代理对象和真实对象实现相同的接口
                        2. 代理对象 = Proxy.newProxyInstance();
                        3. 使用代理对象调用方法。
                        4. 增强方法

                    * 增强方式:
                        1. 增强参数列表
                        2. 增强返回值类型
                        3. 增强方法体执行逻辑    
@Override
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)  throws IOException, ServletException {
    //1、创建代理对象,增强getParameter()方法
    ServletRequest request_proxy = (ServletRequest)Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvokeHandler(){
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //要增强getParameter(),所以进行个判断
            if("getParameter".equals(method.getName())){
                //增强返回值,对request对象值请求参数中的值进行个修改
                String parameter = (String)method.invoke(servletRequest,args);
                //进行修改然后返回
                return parameter.replace("#","");
            }else {
                return method.invoke(servletRequest,args);
            }
        }
    });
    //2、放行
    filterChain.doFilter();
}
0

评论 (0)

取消