FilterAndListener

Filter:过滤器

概念

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

作用

  • 一般用来拦截一些通用的操作.如:登录验证,统一编码设置,敏感字符过滤…

快速入门

步骤:

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

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


/** * @author 雷雨 * @date 2020/5/17 9:26 * * 过滤器的快速入门 * 1.创建一个类实心Filter接口(注意导入的包是javax.servlet.Filter) * 2.复写方法 * 3,配置拦截路径 */
@WebFilter("/*")
public class FilterDemo1 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.使用web.xml配置拦截路径

和注解方法的配置的作用是一样的

<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
</filter-mapping>

2.过滤器执行过程

拦截前对request资源进行增强------>执行要拦截的资源------->拦截之后对于response资源进行增强

3.过滤器生命周期方法

package per.leiyu.web.filter;

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

/** * @author 雷雨 * @date 2020/5/17 10:36 */
@WebFilter(filterName = "FilterDemo3")
public class FilterDemo3 implements Filter {
    public void destroy() {
        //在服务器启动后自动执行,只执行一次,一般用于资源的加载
        System.out.println("filter拦截器执行之前");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //我们需要拦截器执行的业务逻辑方法写在这里
        System.out.println("filter拦截器执行");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        //在服务器关闭时执行,只执行一次,一般用于资源的释放
        System.out.println("filter拦截器执行后");
    }

}

4.过滤器配置详解

4.1拦截路径的配置

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

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

/** * @author 雷雨 * @date 2020/5/17 10:46 * *拦截路径的配置方式 * 1:具体的路径拦截 */
//@WebFilter("/index.jsp") //具体的路径拦截
//@WebFilter("/user/*") //目录拦截方式
//@WebFilter(".jsp") //后缀名拦截方式
@WebFilter("/*")    //拦截所有的资源
public class FilterDemo4 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo4...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

4.2拦截方式的配置

  • 拦截方式:资源被访问的方式

我们之前的资源的访问方式可以是:

​ 1.发送请求,即直接浏览器向服务器发送请求,

​ 2.请求转发,正在访问浏览器的资源,在浏览器中进行请求转发,直接访问服务器中的资源

而现在用Filter也可以来配置资源被访问的方式(拦截方式),有两种方式

4.2.1注解方式配置拦截方式
  • 设置dispatcherTypes属性:
    1. REQUEST:默认值.浏览器直接请求资源
    2. FORWARD:转发访问资源
    3. INCLUDE:包含访问资源
    4. ERROR:错误跳转资源
    5. ASYNC:异步访问资源
4.2.2web.xml方式配置拦截方式

设置dispatherTypes标签

<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
  <!--dispatherTypes还是5个取值和在注解中的取值是一样的 -->
  <dispatherTypes>REQUEST</dispatherTypes>
</filter-mapping>

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

  • 执行顺序的问题:

如果有两个过滤器,分别为过滤器1和过滤器2

执行顺序:

过滤器1---->过滤器2---->资源执行----->过滤器2----->过滤器1

  • 过滤器先后顺序问题:

    1. 注解配置:按照类名的字符串比较规则比较,值小的先执行

      如:AFilter 和BFilter ,那么肯定是AFilter过滤器先执行

    2. web.xml:谁定义在上面,谁先执行

案例:登录验证:

需求:

  1. 访问case_filter案例的资源.验证其是否登录
  2. 如果登录了,则直接放行
  3. 如果没有登录,则跳转带登录页面,提示"您尚未登录,请先登录"

Listener***

  • web的三大组件之一.

事件监听机制:

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

servletContextListener:监听servletContext对象的创建和销毁

  • void contextDestroyed(ServletContextEvent sce):servletContext对象在销毁之前会调用这个方法

  • void contextInitialized(ServletContextEvent sce):servletContext对象在创建后悔调用该方法

    • 一般用于加载资源

    • 步骤:

      1. 获取servletContext对象:servletContext servletcontext = servletContextEvent.getservletContext();

      2. 加载资源文件

        String contextfigLocation = servletContext.getInitParameter(“contextfigLocation.xml”);

      3. 获取真实路径

        Sting realPath = servletContext.getReaPath(contextfigLocation )

      4. 用一个流对象关联(加载进内存

        FileInputStream fis = new FileInputStream(realpath);

实现***的步骤:

  1. 定义一个类,实现servletContextListener接口
  2. 复写方法
  3. 配置
    1. web.xml
    2. 注解的配置方式
全部评论

相关推荐

从大一开始就开始学习Java,一路走来真的不算容易,每次面试都被压力,不过这次终于达成了自己的一大心愿!时间线和面经:8.17-投递9.1-一面实习+项目拷打看门狗机制讲一下redis加锁解锁的本身操作是什么Lua脚本是干什么的udp和tcp讲一下流量控制讲一下令牌桶算法说一下大端和小端是什么线程和协程有什么区别怎么切换协程切换的时候具体做了什么对于程序来说,你刚才提到的保存和恢复现场,这个现场有哪些信息udp优势现在有一个客户端和服务端,要实现TCP的通信,我们的代码要怎么写服务器怎么感知有新的连接怎么处理多个客户端的请求连接TCP怎么处理粘包和分包现在有两个文件,然后每个文件都有一亿条URL,每个的长度都很长,要怎么快速查找这两个文件共有的URLHashmap底层说一下怎么尽量提升插入和查询的效率如果要查找快,查询快,还有解决非空的问题,怎么做LoadingCache了解吗手撕:堆排序9.4-二面部门的leader,超级压力面拷打实习+项目,被喷完全没东西类的加载到垃圾回收整个底层原理讲一遍类加载谁来执行类加载器是什么东西,和进程的关系Java虚拟机是什么东西,和进程的关系如果我们要执行hello&nbsp;world,那虚拟机干了什么呢谁把字节码翻译成机器码,操作时机是什么Java虚拟机是一个执行单元吗Java虚拟机和操作系统的关系到底什么,假如我是个完全不懂技术的人,举例说明让我明白一个操作系统有两个Java程序的话,有几个虚拟机有没有单独的JVM进程存在启动一个hello&nbsp;world编译的时候,有几个进程JVM什么时候启动比如执行一条Java命令的时候对应一个进程,然后这个JVM虚拟机到底是不是在这个进程里面,还是说要先启动一个JVM虚拟机的进程垃圾回收机制的时机能手动触发垃圾回收吗垃圾回收会抢占业务代码的CPU吗垃圾回收算法简单说说垃圾回收机制的stop&nbsp;the&nbsp;world存在于哪些时机垃圾回收中的计算Region的时候怎么和业务代码并行执行假如只有一个线程,怎么实现并行Java为什么要这么实现Java效率比C++慢很多,那为什么还要这样实现Java虚拟机到底是什么形式存在的说一下Java和C++的区别还有你对Java设计理念的理解无手撕面试结束的时候,我真的汗流浃背了,面试官还和我道歉,说他是故意压力面想看看我的反应的,还对我给予了高度评价:我当面试官这么多年,你是我见过最好的一个9.9-三面临时通知的加面,就问了三十分钟项目9.11-hr面问过往经历,未来计划,想从腾讯实习中得到什么?当场告知leader十分满意我,所以直接ochr面完一分钟官网流程变成录用评估中,30分钟后mt加微信告知offer正在审批9.15-offer这一次腾讯面试体验真的不错,每个面试官能感觉到专业能力很强,反馈很足,比起隔壁某节真是好太多以后就是鹅孝子了
三本咋了:当面试官这么多年你是我见过的最好的一个
你面试被问到过哪些不会的...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务