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

学习JavaWeb(八)——Filter过滤器和Listener监听器

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

学习JavaWeb(八)——Filter过滤器和Listener监听器

学习JavaWeb(八)——Filter过滤器和Listener监听器

 

前言

继续学习JavaWeb,学到Filter过滤器和Listener监听器。


Filter 概念

过滤器是我们JavaWeb的三大组件之一,另外两个是Servlet、Listener

当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

作用

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

入门

编写过滤器的步骤:

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

创建一个java文件,使其继承于Filter(注意对应包是javax.servlet),其中doFilter方法就是对请求响应的拦截:

//注意,Filter所属包是:javax.servlet
@WebFilter("
        Country proxy_cn = (Country)Proxy.newProxyInstance(cn.getClass().getClassLoader(),
                cn.getClass().getInterfaces(),
                new InvocationHandler() {
                    
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("invoke方法执行了");
                        //调用真实对象执行该方法
                        method.invoke(cn);
                        return null;
                    }
                });
        //2.调用方法
        proxy_cn.show();
    }
}

如同我注释上面写的一样,Proxy.newProxyInstance方法需要三个参数:

  1. 类加载器:得到真实对象 getClass().getClassLoader()
  2. 接口数组:确保真实对象和代理对象同样的接口 getClass().getInterfaces()
  3. 处理器:InvocationHandler(),匿名内部类来实现

学英语:invocation:求助、调用、启用

得到的代理对象调用方法其实是调用了InvocationHandler中的方法invoke,我们在invoke中实现对方法的执行以及其他功能。

invoke方法参数:

  1. proxy:代理对象
  2. method:代理对象调用的方法被封装为的对象
  3. args:代理对象调用方法时,传递的实际参数

这样,我们就可以在invoke中进行各种的增强处理。

过滤敏感词

了解了动态代理,我们来实现过滤敏感词汇。

在src目录下创建一个txt文件,每行写一个敏感词,然后创建我们的Filter文件,内容如下:

@WebFilter("
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ContextServlet对象被创建了!");
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ContextServlet对象被销毁了!");
    }
}

然后我们在WEB-INF下的web.xml中进行配置:

    
    
        pers.luoluo.web.listener.ContextLoaderListener
    

这样,我们启动项目和关闭项目(正常关闭),就会分别打印信息。

用途示例

那请问这监听器有什么用呢?其实这种类似“生命周期方法”,主要的用处就是进行一些资源的初始化。

我们来举个例子,来加载某个配置文件进入内存,例如在src目录下存在文件applicationContext.xml,然后在web.xml中有设置参数:

    
    
        contextConfigLocation
        /WEB-INF/classes/applicationContext.xml
    

这个参数键值对可以通过ServletContext访问。

故我们在监听器中,可以通过servletContextEvent得到ServletContext

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //加载资源文件
        //1.获取ServletContext对象
        ServletContext servletContext=servletContextEvent.getServletContext();
        //2.加载资源文件
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        //3.获取真实路径
        String realPath = servletContext.getRealPath(contextConfigLocation);
        //4.加载进内存
        try {
            FileInputStream fls=new FileInputStream(realPath);
            System.out.println(fls);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("ContextServlet对象被创建了!");
    }

当我们启动项目的时候,打印:

java.io.FileInputStream@28ae693f

即说明文件流被成功创建,可以读取文件信息。


商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

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

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

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