#Filter、Listener#JavaWeb学习笔记(2020/3/5)

一、Filter

作用:

1、登录验证——不登录不让请求其他资源
2、关键字过滤
.....

使用方法:

  • 1、创建一个Filter接口的实现类,重写接口中的抽象方法
public class FilterDemo1 implements Filter {
    public void init(FilterConfig config) throws ServletException {

    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }
    public void destroy() {
    }
}

Filter接口中的方法说明:

  • ①.init方法:服务器启动时,会创建Filter对象,调用唯一的一次init方法。

  • ②.doFilter方法:每次有过滤路径的资源的请求,就调用一次。
    chain.doFilter(req, resp);作用是放行。

  • ③.destroy方法:服务器正常关闭前,调用一次,一般用于释放资源。

  • 2、用web.xml或者使用注解进行配置

        1. web.xml配置    
            <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>
        2.注解配置:
            @WebFilter(value = "拦截路径" , dispatcherTypes={拦截方式,..} )

拦截路径的写法:

  1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
  3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
  4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

拦截方式的写法:

设置dispatcherTypes属性
DispatcherType. REQUEST:默认值。浏览器直接请求资源
DispatcherType. FORWARD:转发访问资源
DispatcherType. INCLUDE:包含访问资源
DispatcherType. ERROR:错误跳转资源
DispatcherType. ASYNC:异步访问资源

过滤器链:就好比几层的筛子。

过滤器的执行流程:
1. 过滤器1
2. 过滤器2
3. 资源执行
4. 过滤器2
5. 过滤器1


图片.png

过滤器先后顺序问题:

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

二、动态代理实现request对象增强

代理模式是一种设计模式
所谓代理就是第三方,去调用原来的方法并且在此之上进行一些功能的增强,何为动态代理,就是使用反射技术进行实现,不用依赖于具体的类文件。

关于代理的概念:

    1. 真实对象:被代理的对象
    1. 代理对象:真实对象增强之后的对象。
    1. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的。

动态代理的实现步骤:

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

newProxyInstance()方法的参数列表:

  真实对象.getClass().getClassLoader()——类加载器,把真实对象的Class对象加载进入内存。
  真实对象.getClass().getInterfaces()——获取所有的接口的Class对象
  new InvocationHandler(){
  代理对象调用所有的方法都会执行此方法,调用的方法对象会传给method参数。
  代理对象调用方法的参数会传递给args数组对象。
  匿名内部类实现 invoke(Object proxy, Method method, Object[] args) 方法
}

敏感字过滤器

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
//拦截资源路径为testSensitiveFilterServlet
@WebFilter("/testSensitiveFilterServlet")
public class SensitivewordsFilter implements Filter {
    List<String> sensitiveWordsList = new ArrayList<String>();
    public void init(FilterConfig config) throws ServletException {
        try{
            String realPath = config.getServletContext().getRealPath("/WEB-INF/classes/words.txt");
            System.out.println(realPath);
            BufferedReader br = new BufferedReader(new FileReader(realPath));
            String line = null;
            while((line = br.readLine())!=null){
                sensitiveWordsList.add(line);
            }
            System.out.println(sensitiveWordsList);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //使用动态代理来增强getParameter方法,完成过滤工作

        ServletRequest proxy_Requset = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            //调用getParameter方法method就是getParameter方法对象
            //args是getParameter(String str)的str数据。
            //调用setAttribute方法method就是setAttribute方法对象
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                if ("getParameter".equals(method.getName())){
                    String msg = (String) method.invoke(req,args);
                    for (String s : sensitiveWordsList) {
                        if (msg.contains(s)){
                            msg = msg.replaceAll(s,"***");
                        }
                    }
                    return msg;
                }
                return method.invoke(req,args);
            }
        });
        chain.doFilter(proxy_Requset, resp);
    }


    public void destroy() {
    }


}

三、监听器Listener

Web三大技术:Servlet、Filter、Listener

事件监听机制

  • 事件 :一件事情
  • 事件源 :事件发生的地方
  • 监听器 :一个对象
  • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

ServletContextListener:web容器监听器
监听ServletContext对象的创建和销毁

  • 方法:
    • void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
    • void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
  • 步骤:
      1. 定义一个ServletContextListener的实现类,重写接口的抽象方法。
      1. 配置
        1. web.xml
    <listener>
             <listener-class>监听器类的路径</listener-class>
    </listener>
   <!-- 指定初始化参数,一般用来加载默认配置 -->
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
   </context-param>

//使用servletContext.getInitParameter("contextConfigLocation");就能获取到param-value里的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容