内容介绍

1.Filter过滤器
2.listener监听器

Filter过滤器

概述

web服务器端有三大技术:Servlet Filter Listener

Servlet:本质上是一个类,这个类需要实现Servlet接口规范
作用:可以做浏览器和服务器之间的交互请求和响应
Filter:本质上是一个类,这个类需要实现Filter接口规范
作用:对浏览器访问服务器资源时的一种拦截,符合条件才放行  不符合条件不放行访问资源
资源:项目里面的资源 比如:Servlet html jsp  js jpg...

作用

主要作用:拦截浏览器访问服务器的请求的

ps:也会拦响应,但是企业主要用于拦请求

filter的使用

1 xml配置文件方式(掌握)

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


2 注解配置方式(了解)

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

filter的细节

1.filter不是对所有资源都拦截,需要拦截哪些资源都需要配置filter
2.如果多个filter都对同一个资源拦截,那多个filter都会执行配置文件中:多个filter的执行顺序是web.xml的上下配置顺序注解中:    执行的顺序是按照filter文件名的自然排序顺序
3.如果filter放行,找的是看看有没有下一个过滤器执行,如果没有下一个过滤器才会执行服务器的资源


Filter的执行流程:(了解)

filter的生命周期(了解)

从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()
服务器启动创建filter对象执行init方法
浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次
当服务器关闭的时候 执行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
作用
1.request response之前怎么用 在filter中还怎么用
2.FilterChain:过滤器链对象 作用:维护过滤器的执行顺序的 核心放行方法: chain.dofilter(req,res)

Filter的配置

1.filter的资源路径配置(面试题)
有3种方式来配置filter的拦截路径

1.完全路径匹配: 以/开始  例如:/sd1  /a/b/c/sd1   匹配单一资源的匹配 注意:<url-pattern>标签可以出现多个
2.目录匹配:以/开始 以*结尾  例如:/*   /a/b/*     匹配目录下的所有资源
3.扩展名匹配:不以/开始 以.结尾  例如:*.jsp  *.jpg  *.html  匹配一类资源的

2.filter的拦截方式配置
默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求(请求转发)
配置filter拦截服务器内部的请求

 // 请求转发request.getRequestDispatcher("/sd4").forward(request,response);// 重定向response.sendRedirect(request.getContextPath()+"/sd4");

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

注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置filter既会拦截浏览器过来的请求 又会拦截服务器内部的请求
//为servlt统一处理请求和响应的中文乱码
public class EncodeFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=utf-8");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}
// xml方式(掌握)   注解方式(了解)
/*
* xml方式:
*       1 创建1个类实现filter接口(javax包下的)
*       2 在web.xml中配置该filter要拦截的资源是谁
*
* */import javax.servlet.*;
import java.io.IOException;//@WebFilter(urlPatterns = "/sd1")
public class MyFilter1 implements Filter{/** 执行时机:服务器启动创建该Filter执行init方法* 执行次数:1次* 执行者:tomcat** */@Override  //filter的初始化方法public void init(FilterConfig filterConfig) throws ServletException {System.out.println("我出生了...555");//filterConfig:是当前filter的配置对象//1 可以获取当前filter的名字System.out.println(filterConfig.getFilterName());//2 获取域对象(ServletContext对象)System.out.println(filterConfig.getServletContext());}/** 执行时机:拦截住了匹配的资源就执行* 执行次数:访问一次 执行一次* 执行者:tomcat** */@Override //核心拦截方法public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter1拦截了...");// filter默认都是拦截的 如果想不拦截资源了,要手动放行// 核心放行方法filterChain.doFilter(servletRequest,servletResponse);}/** 执行时机:服务器关闭执行* 执行次数:1次* 执行者:tomcat** */@Override // filter的销毁方法public void destroy() {System.out.println("我凉凉了...666666666");}
}
//过滤器:
public class FeifaFilter implements Filter{private List<String> list=new ArrayList();@Override // 服务器启动就执行一次public void init(FilterConfig filterConfig) throws ServletException {try {// 2 当要判断的时候,需要加载该文档,读取内容String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");File file = new File(realPath);InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");BufferedReader br=new BufferedReader(is);// 3 将读取的非法字符放入一个容器中(list)String line=null;while ((line=br.readLine())!=null){// 放入集合中list.add(line);}System.out.println(list);}catch (Exception e){e.printStackTrace();}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 1 获取用户发表的言论String info = servletRequest.getParameter("info");// 2 判断该言论是否合法//1 数据库中哟一个非法字符表// 2 非法字符的收集文档.txt// 1 创建一个非法字符的文档,收集非法字符// 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应  不非法:放行if(info!=null&&list.contains(info)){// 3 不合法--写响应信息servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");return;}// 4 合法--放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}

总结filter

filter概述:本质上是一个类,实现了filter接口规范
fitler作用:可以对浏览器访问服务器的请求进行拦截
filter的快速入门:xml方式 注解方式
xml方式:1 创建1个类型实现filter接口 2 在web.xml中进行拦截资源的配置
注解方式:直接在当前的filter类上添加注解 @webFilter(url-pattern="路径")
filter细节
1 filter不是对所有资源都拦截,需要拦截哪个要创建且配置
2 多个filter拦截了同一个资源,多个filter都执行
3 filter放行之后,会找下一个filter执行,直到没有filter了才会去找资源
filter的生命周期
服务器一启动就会创建当前的filter对象执行init方法
当访问到要匹配的资源时,filter的dofilter核心拦截方法执行 访问一次执行那一次
当服务器关闭的时候,filter的destory销毁方法执行
filter拦截方式
filter默认只对浏览器的请求进行拦截 不对服务器的内部跳转请求进行拦截
如果想配置可以在web.xml中进行配置
<filter-mapping><filter-name>MyFilter2</filter-name><url-pattern>/*</url-pattern><!--让当前filter拦截内部的请求转发--><dispatcher>FORWARD</dispatcher><!--让当前filter拦截浏览器过来的请求--><dispatcher>REQUEST</dispatcher>
</filter-mapping>
filter路径配置方式:三种(面试题)
1 完全路径匹配 例如:/sd1 /sd2  针对单一资源的 但是<url-pattern>可以写多分
2 目录匹配 例如: /*   /a/b/*  针对指定目录下的所有资源的
3 扩展名匹配  例如: *.jsp  *.html  针对一种类型的所有资源的

案例一:统一解决所有servlet的乱码问题



案例二:非法字符的过滤
页面

拦截器拦截

package cn.itcast.filter;import javax.servlet.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;//过滤器:
public class FeifaFilter implements Filter{private List<String> list=new ArrayList();@Override // 服务器启动就执行一次public void init(FilterConfig filterConfig) throws ServletException {try {// 2 当要判断的时候,需要加载该文档,读取内容String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");File file = new File(realPath);InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");BufferedReader br=new BufferedReader(is);// 3 将读取的非法字符放入一个容器中(list)String line=null;kwhile ((line=br.readLine())!=null){// 放入集合中list.add(line);}System.out.println(list);}catch (Exception e){e.printStackTrace();}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 1 获取用户发表的言论String info = servletRequest.getParameter("info");// 2 判断该言论是否合法//1 数据库中哟一个非法字符表// 2 非法字符的收集文档.txt// 1 创建一个非法字符的文档,收集非法字符// 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应  不非法:放行if(info!=null&&list.contains(info)){// 3 不合法--写响应信息servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");return;}// 4 合法--放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}

listener–监听器

概述

listener:本质上是一个类,需要实现监听器的接口

作用

监听器可以去监听到域对象的状态变化(ServletContext request session)

状态变化:创建和销毁

提供的监听器:

ServletContextListener: 监听ServletContext创建和销毁(掌握)

ServletRequestListener: 监听request 创建和销毁

HttpSessionListener: 监听session创建和销毁

listener的使用

java提供了各种各样的监听器,每个监听器都有自己的作用

1.ServletContextListener监听器:监听ServletContext对象的创建和销毁的(掌握)

listener监听器的创建

xml方式:(掌握)
1 创建一个java类,实现java提供的指定监听器的接口
2 在web.xml中进行配置注解方式:
在编写的listener类上加上注解  @WebListener
// 成为一个能监听到ServletContext对象的创建和销毁的监听器
//@WebListener
public class Mylistener1 implements ServletContextListener{@Override  //监听创建   ServletContext对象已创建此方法触发public void contextInitialized(ServletContextEvent servletContextEvent) {//System.out.println("ServletContext对象创建了...");System.out.println("服务器一启动就去加载框架的一些配置信息..");}@Override   // 监听销毁  ServletContext对象已销毁此方法触发public void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println("ServletContext对象销毁了...");}
}


xml方式:

注解方式:

扩展一: 用监听器监听request的创建和销毁:



因此,请求一次,创建一个request对象,响应回去,request对象销毁。

用监听器监听request的创建和销毁:

在一个新的会话中,第一次访问到request.getSession()中,创建session对象,几个servlet共用的是一个session对象,会话关闭,重新访问,又是新的session对象。

扩展二: 服务器端servlet的路径问题:

相对路径(不建议用),绝对路径

<%--Created by IntelliJ IDEA.User: muzimooDate: 2019-5-9Time: 18:19To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>访问servlet</title>
</head>
<body><a href="/day07/sd1">访问sd1</a><br/><a href="../../../sd1">访问sd1</a><br/><%--服务器端Servlet的路径问题:绝对路径  相对路径绝对路径:当前浏览器访问servlet的路径   http://localhost:8080/day07/sd1简写: 以/项目名开始的   /day07/sd1相对路径:以./开始   ./sd1==sd1相对比较的是地址栏路径demo.jsp:  http://localhost:8080/day07/demo.jspsd1:       http://localhost:8080/day07/sd1demo.jsp:  http://localhost:8080/day07/html/demo.jspsd1:       http://localhost:8080/day07/sd1../:代表到上一层路径demo.jsp: http://localhost:8080/day07/html/1/2/demojspsd1:     http://localhost:8080/day07/sd1../../../sd1--%></body>
</html>

扩展三: 将servlet的创建时机提前到服务器开启

servlet的生命周期 默认情况下是,当浏览器访问servlet时,创建该servlet对象,执行init方法,且执行一次。
也可以在服务器启动时,创建servlet对象。

扩展四:获取当前项目名路径

web核心 8-filter过滤器 listener监听器 相对路径 绝对路径 项目名路径相关推荐

  1. JAVA WEB篇4——Filter、Listener

    JAVA WEB篇4--Filter.Listener 1.Filter Filter本意为"过滤"的含义,是JavaWeb的三大组件之一,三大组件为:Servlet.Filter ...

  2. Java Web - 服务器中的过滤器和监听器

    一 过滤器 每个servlet都有自己需要处理的资源,这么多的资源我们有时候我们希望统一的进行管理,比如对响应的图片进行加水印处理,对提交和响应的数据的编码进行统一,或者是对提交的数据进行过滤. 解决 ...

  3. Web核心技术之Filter过滤器

    1,Filter 1.1 Filter概述 Filter 表示过滤器,是 JavaWeb 三大组件(Servlet.Filter.Listener)之一.Servlet 我们之前都已经学习过了,Fil ...

  4. javaweb(11) Listener监听器与Filter过滤器

    javaweb(11) Listener监听器与Filter过滤器 Listener监听器 什么是Listener监听器 Listener 监听器它是 JavaWeb 的三大组件之一.JavaWeb ...

  5. Filter(过滤器)、Listener(监听器)

    一: 过滤器: 可以把"不和谐"的东西给过滤掉 01.过滤器概述 生活中的过滤器:带有过滤功能的净水器,滤纸,香烟的过滤嘴,测试,丈母娘.程序中的过滤器:在JAVA中最小的程序单元 ...

  6. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

  7. Filter过滤器介绍及使用

    文章目录 1.Filter 什么是过滤器 2.Filter 的初体验 Filter过滤器的使用步骤: 3.Filter的生命周期 4.FilterConfig 类 5.FilterChain 过滤器链 ...

  8. Filter过滤器(超详细)

    声明:本文是根据博主学习内容所整理得的笔记,仅作为交流学习使用,需要观看视频的请移步:http://www.atguigu.com/ 1.Filter ?什么是过滤器 Filter 过滤器它是 Jav ...

  9. 第6章 使用过滤器和监听器

    开心一笑 [对于不诚实的男友,要毫不犹豫地把他前任掉,就比如我的前任,明明是个无神论者,非要叫我女神,不能忍!] 新书购买 戳图购买 >>> 6.1 Spring Boot使用过滤器 ...

最新文章

  1. 五 Android Studio打包Eegret App (包名和签名,打出正式包)
  2. Spring Cloud限流详解(附源码)
  3. wxWidgets 示例展示了 wxSecretStore 类的使用
  4. phantomjs安装所需依赖
  5. html---textarea初始化时就有个table空格以及tab键操作无效
  6. 机器学习实战9-运行Tensorflow(california_housing数据集)
  7. 九眼合同智能审核系统运用NLPIR大数据技术进行核查
  8. springboot自定义starter启动器
  9. 计算机代数与数论pdf,基础数论算法 - maTHμ - 计算机代数系统.pdf
  10. hrbust 哈理工oj 2026 势力较量【并查集】
  11. 北科大学计算机考研难度,2019二本考上北科计算机专硕经验分享
  12. 系统全面的认识Solr
  13. 华为手机 从服务器获取安装包信息,华为openGauss 获取并校验安装包
  14. 【信管2.6】项目可研(二)详细可行性研究
  15. 前途迷茫不知.NET与JAVA那个好
  16. 什么软件可以测试提速,谁是手机加速神器?三款常用加速软件横评
  17. (3)riak_core系统的工作方式
  18. iCloud照片库和照片流的差别
  19. 最大公约数、最小公倍数算法思想
  20. Matplotlib的一些基本概念

热门文章

  1. 根目录扩容(红帽系列,版本2)
  2. 深入解读小间距led显示屏的未来发展应该何去何从?
  3. 如何让百度网盘的分享死链复活?
  4. 从一个文档复制粘贴到另一个文档时把ndnote插入的参考文献也复制过去
  5. 深度学习在基因组学中的应用
  6. (六)Linux操作系统之Linux软件包管理
  7. 基于华为云平台上iMaster-NCE Campus的中继认证(RADIUS方式)方案简介及配置参考
  8. nt5src去除激活的winlogon
  9. 路由器密码忘记 五步暴力破解
  10. 互联网行业喜欢推陈出新,玩概念,各种新词层出不穷