ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

filter过滤器&listener监听器

2022-01-19 21:02:00  阅读:156  来源: 互联网

标签:listener 销毁 浏览器 filter 监听器 拦截 public


filter过滤器

概述

1)什么是filter servlet listener?

服务器端有三个组件:servlet filter listener
servlet: 本质上就是一个实现接口规范(servlet)的类,可以对浏览器的请求和响应做处理
filter:本质上就是一个实现接口规范(filter)的类,可以对浏览器访问服务器请求时的一种过滤
lstener:本质上就是一个实现接口规范(很多)的类,监听域对象的状态变化(创建和销毁)

2)filter的作用?

filter的核心作用:对浏览器的请求做拦截过滤(不放行 放行)

3)filter如何使用?

1 xml的配置方式
		适用于第三方提供的过滤器或者是自己编写的过滤器
2 注解的配置方式
		适用自己编写的过滤器 

xml配置文件方式:

创建一个java类,实现filter的接口
在web.xml中配置filter要拦截的资源

注解方式:

在自定义的filter类上添加注解:
@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")

注解方式:

package cn.itcast.filter;

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

//注解配置
@WebFilter(urlPatterns = "/sd1")
public class MyFilter1 implements Filter {

    // filter创建会执行的方法
    public void init(FilterConfig config) throws ServletException {

    }

    // filter的核心过滤方法
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        System.out.println("我是拦截器,我拦截住了浏览器的请求...");

        // 默认没有放行
        //手动放行
        chain.doFilter(req,resp);
    }

    //filter销毁会执行的方法
    public void destroy() {
    }


}

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">


    <filter>
        <filter-name>MyFilter1</filter-name>
        <filter-class>cn.itcast.filter.MyFilter1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter1</filter-name>
        <!--filter要拦截的路径-->
        <url-pattern>/sd1</url-pattern>
    </filter-mapping>

</web-app>

filter知识点

1) 多个filter的执行顺序

特点:多个filter对同一个资源匹配,如果访问该资源多个filter都会执行
	配置文件方式:如果多个filter对同一个资源进行了拦截 执行的顺序是配置文件的从上到下顺序
	注解方式:如果多个filter对同一个资源进行了拦截 执行的顺序是按照filter文件名的自然排序循序

2) filter的执行流程

在这里插入图片描述

3) filter的生命周期(了解)

从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()
服务器启动创建filter对象执行init方法
浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次
当服务器关闭的时候 销毁当前filter 执行destory方法 
总结:filter的关注点:开发只关注doFilter()核心过滤方法

filter生命周期方法中参数:(了解)

方法:init(FilterConfig config)  
参数:filterConfig   当前filter的配置对象
作用: 1 可以获取到当前filter的名称   getFilterName()
      2 可以获取到ServletContext对象 getServletContext()

方法:doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
参数:request response  filterChain
作用:request response之前怎么用 在filter中还怎么用
      filterChain可以做当前filter的放行  放行方法:filterChain.dofilter(req,res)
@WebFilter(urlPatterns = "/*")
public class MyFilter3 implements Filter {
    @Override  //出生:服务器启动执行
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("1111111111");
        //FilterConfig:filter的配置信息对象
        // 1 filter的名字获取
        System.out.println(filterConfig.getFilterName());
        // 2 servletcontext对象获取
        System.out.println(filterConfig.getServletContext());
    }

    @Override //核心方法 进行拦截过滤的方法 匹配一次 执行一次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("我拦截了浏览器访问服务器的请求...33333");
        //放行(固定代码)  默认不写是不放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override //死亡:服务器关闭执行
    public void destroy() {
        System.out.println("2222222222222");
    }
}

4)Filter的配置

1.filter的资源路径配置

有3种方式来配置filter的拦截路径
完全路径匹配: 以/开始    例如:/a   /a/sd1       
注意:url-pattern可以写多个

目录匹配:以/开始 以*结尾  例如:/*  /a/*         


扩展名匹配:不以/开始 以.结尾  例如:*.do *.action

2.filter的拦截方式

默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求

如果想让filter拦截服务器内部的请求:
1:xml方式配置
在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>
但是这种配置将filter默认的拦截方式给覆盖了 只会连接服务器内部的请求 不会再拦截默认的浏览器请求了
想让让filter拦截服务器内部的请求又拦截浏览器过来的请求:
  <filter-mapping>
        <filter-name>MyFilter2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>  配置拦截服务器内部请求
        <dispatcher>REQUEST</dispatcher>  配置拦截浏览器的请求
</filter-mapping>


2:注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置既会拦截浏览器过来的请求 又会拦截服务器内部的请求

Listener(监听器)

概述

1)什么是监听器?

servlet:本质上是一个类,实现了java的servlet规范,可以进行浏览器请求的接受和给浏览器响应
filter: 本质上是一个类,实现了java的filter规范,可以对浏览器访问服务器资源时的一种拦截
listener:本质上是一个类,实现了java的各种监听器规范,可以监听其它对象(域)的状态变化(创建 销毁)

2)监听器的作用

作用:就会为了监听servletContext,request,session三大域对象的状态变化
													三个域对象的创建和销毁

3)java提供的监听器规范

java为我们提供了监听器规范,不同的监听器规范要监听的内容不一样

监听三个域对象的创建和销毁:

ServletContextListener(掌握)
					----后期框架的配置文件在服务器启动就执行
ServletRequestListener
HttpSessionListener

监听器的使用

1 编写一个类,实现listener接口
2 去web.xml/注解里面做配置

监听servletContext的创建和销毁:ServletContextListener

创建:服务器只要一开启,就为每个项目创建一个对应的ServletContext对象
销毁: 服务器只要一关闭,就销毁ServletContext对象

代码实现:

// 监听servletContext对象的创建和销毁   实现java提供的监听器规范(ServletContextListener)
//@WebListener
public class ServletContextLoaderListener implements ServletContextListener {

    @Override  //当servletContext对象被创建了 监听器触发 该方法执行
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext对象被创建了...");

        // 让服务器一加载 就读取框架的配置信息 进行加载
        ServletContext servletContext = servletContextEvent.getServletContext();
        String value = servletContext.getInitParameter("spring");
        System.out.println("就可以正式根据获取到的配置文件名,对该文件的内容进行加载了:"+value);
        System.out.println("正在加载该配置文件中....");

    }

    @Override //当servletContext对象被销毁了 监听器触发 该方法执行
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext对象被销毁了...");
    }
}

监听ServletRequest的创建和销毁:ServletRequestListener

创建: 浏览器每次访问服务器就会创建request对象
销毁: 服务器响应给浏览器的时候该request对象销毁

代码实现:

// 监听request对象的创建和销毁   实现java提供的监听器规范(ServletRequestListener)
//@WebListener
public class RequestLoaderListener implements ServletRequestListener{

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        
        System.out.println("request对象销毁了。。");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        
        System.out.println("request对象创建了。。");
    }
}

监听HttpSession的创建和销毁:HttpSessionListener

创建:第一次调用request.getSession 创建session对象
销毁:
默认不用30分钟后自动销毁或者主动销毁session.invalidate()

代码实现:

// 监听session对象的创建和销毁   实现java提供的监听器规范(HttpSessionListener)
@WebListener
public class SessionLoaderListener implements HttpSessionListener {


    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session创建了...");

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session销毁了...");
    }
}

标签:listener,销毁,浏览器,filter,监听器,拦截,public
来源: https://blog.csdn.net/Peng_zhj/article/details/122589621

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有