过滤器filter,监听器listener

目录

  • 1. filter过滤器
    • 1.1 原理
    • 1.2 配置
    • 1.3 过滤掉脏话demo
  • 2. listener监听器
    • 2.1 作用
    • 2.2 ServletContextListener demo

1. filter过滤器

  • 作用:
  • 过滤servlet,jsp,js,css,图片对象,以及一切在服务器,客户端想访问的对象
  • 用来设置编码,过滤掉脏话等…
  • 过滤器链:你有多个过滤器,你如果多个filter过滤一个servlet,配置一个servlet,那么这个多个过滤器会形成过滤器链。

1.1 原理

  • 不多bb,请看下面的图

  • 就像学校的图书馆,你进学校有保安守着校门,这是一次过滤,进学校图书馆,你得刷卡,才可自习。只是过滤器可以配置多个,对不同得对象…

1.2 配置

  • 比如我想创建一个过滤掉脏话的过滤器叫FilterDirtyTalk
  • 对DirtyMsg servlet进行过滤
  <filter><filter-name>FilterDirtyTalk</filter-name><filter-class>filter.FilterDirtyTalk</filter-class><!-- 与servlet配置相似 --></filter><filter-mapping><filter-name>FilterDirtyTalk</filter-name><url-pattern>/DirtyMsg</url-pattern> <!-- 想进入dirtymsg servlet 得先经过filter --></filter-mapping>
  • 但是上面的servlet只能过滤从jsp进来的 !假如,你有业务,从一个servlet转发到jsp后台页面,但是这个页面要登录才行。你没登录,按上面的配置,过滤器过滤不到,所以来了解过滤器的规则。

  • 过滤器过滤规则

FORWARD:转发时进行过滤
REQUEST:浏览器直接请求时进行过滤(默认:没有配置dispatcher节点的时候)
INCLUDE:动态包含的时候执行过滤器
<%@ include %>:静态包含,把被包含的页面的源代码拷贝过来与包含页面一起转译编译运行;包含的过程中不能传参
jsp:include动态包含:包含页面和被包含页面分开转译编译运行,然后将结果合并到一起;包含的过程中可以传参
ERROR:在出错的时候进入过滤器

  • 在web.xml <filter-mapping>加上
  	<dispatcher>REQUEST</dispatcher> <!-- 默认对请求进行过滤 --><dispatcher>FORWARD</dispatcher> <!-- 会检查请求转发-->

1.3 过滤掉脏话demo

  • 过滤掉脏话filter_config.txt 文本文件
你妹=妹妹
你弟=弟弟
你妈=妈妈
  • 拿到request对象中的用户请求数据,继承HttpServletRequestWrapper
package servlet;import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class MyRequest extends HttpServletRequestWrapper {private Map<String, String[]> map;public MyRequest(HttpServletRequest request) {super(request);map = request.getParameterMap();	}@Overridepublic String getParameter(String name) {// 返回第一个值String[] str = map.get(name);if (str.length > 0 && str != null)return str[0];return null;}@Overridepublic Map<String, String[]> getParameterMap() {// 返回mapreturn map;}@Overridepublic String[] getParameterValues(String name) {// string数组值return map.get(name);}}
  • 把脏话转成civilized word
package filter;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;import servlet.MyRequest;public class FilterDirtyTalk implements Filter {@Overridepublic void destroy() {// 过滤掉 你妹,你妈,你弟等 -> 你妹=妹妹 // tomcat8.0 给你的版本map是副本, 重写HttpServletRequestWrapper 重新拿到map的值 ... }@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest hreq = (HttpServletRequest) req;// 把请求改变为我的请求类,里面正真的改变了map集合req = new MyRequest(hreq);if (hreq.getMethod().equalsIgnoreCase("get")) { // get方式// tomcat 8.0 已经设置好了get编码} else if (hreq.getMethod().equalsIgnoreCase("post")) {req.setCharacterEncoding("utf-8");}resp.setContentType("text/html;charset=utf-8");File file = new File("E:\\servletStudy\\Servlet3\\filter_config.txt");// 读取脏话FileReader fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);HashMap<String, String> dirtyMap = new HashMap<String, String>();// 改变value的值 如果是dirty-talk// 读取filter-configString str = br.readLine();while (str != null) {dirtyMap.put(str.split("=")[0], str.split("=")[1]);str = br.readLine();}	// 把脏话放入集合。。。Set<Entry<String, String>> dirtySet = dirtyMap.entrySet();// 请求对象键值对Map<String, String[]> map = req.getParameterMap();Set<Entry<String,String[]>> entrySet = map.entrySet();for (Entry<String, String[]> entry : entrySet) {String key = entry.getKey(); // 请求对象参数String[] value = entry.getValue(); // 请求对象值System.out.println(key + "\t" + Arrays.toString(value));for (int i = 0; i < value.length; i++) {for(Entry<String, String>  set : dirtySet) {String dirty = set.getKey();if (dirty.equals(value[i]))value[i] = set.getValue();}}System.out.println("转换后");System.out.println(key + "\t" + Arrays.toString(value));}br.close();fr.close();// 放行 jsp才可访问servlet...chain.doFilter(req, resp);}@Overridepublic void init(FilterConfig arg0) throws ServletException {}}
  • DirtyMsg 拿到jsp页面过滤的值
package servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DirtyMsg extends HttpServlet {/*** dirty msg*/private static final long serialVersionUID = 1L;@Overrideprotected void service(HttpServletRequest req, HttpServletResponse arg1)throws ServletException, IOException {String name1 = req.getParameter("name1");String name2 = req.getParameter("name2");String name3 = req.getParameter("name3");System.out.println(name1 + name2 + name3);}
}
  • jsp页面

  • 正确过滤后:

2. listener监听器

2.1 作用

  • 用来监听request/session/application的创建/销毁/数据操作
  • 讲一个ServletContextListener, 用来监听application的创建和销毁(监听tomcat的开启和关闭)

2.2 ServletContextListener demo

  • 配置
  <listener><listener-class>test.MyServletContextListener</listener-class></listener>
  • 实现
package test;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("服务器开启啦。。。 可以初始配置文件啦...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("服务器销毁啦。。。");}}
  • ServletContextAttributeListener,元素的移除,可得到移除信息,rbr
  • request,session的套路类似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(一)elasticsearch6.1.1安装详细过程

1、配置java环境 检查java环境 满足elasticsearch6.1.1java环境要求&#xff1b; 2、安装ElasticSearch6.1.1 ①为es新生成用户、用户组 su root groupadd esgroup useradd ela -g esgroup -p 5tgbhu8[rootlocalhost fibonacci]# su ela Attempting to create directory /h…

使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件

xml的创建&#xff0c;解析1. 什么是xml文件1.1 什么是xml文件1.2 解析xml的方式&#xff0c;优缺点2. 使用dom操作xml文件2.1 使用dom创建xml文件2.2 使用dom解析xml文件2.3 使用dom对xml文件增删改3. 使用SAX解析xml文件4. 使用DOM4J操作xml文件4.1 使用DOM4J创建xml文件4.2 …

(二)ElasticSearch6.1.1 Python API

0、准备开启数据库 ① 关闭Linux防火墙&#xff0c;这个很重要&#xff0c;否则API总是报错连不上。 # 查看防火墙状态 firewall-cmd --state# 关闭防护墙 systemctl stop firewalld.service# 开启防火墙 systemctl start firewalld.service# 重启防火墙 systemctl restart f…

sqlite3数据库使用

SQLite简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&#xff0c;这是在普及方面的增长&#xff0c;与它的尺寸大小无关。SQLite 源代码不受版权限制。 什么是sqlite SQLite是一…

(三)ElasticSearch的基本概念

0、面向文档 应用中的对象很少只是简单的键值列表&#xff0c;更多时候它拥有复杂的数据结构&#xff0c;比如包含日期、地理位置、另一个对象或者数组。 总有一天你会想到把这些对象存储到数据库中。将这些数据保存到由行和列组成的关系数据库中&#xff0c;就好像是把一个丰…

ajax下拉框省市级联动

目录效果sql数据前后台代码实现效果 初始访问页面 选中省会&#xff0c;自动刷新页面 sql数据 -- 省市联动数据CREATE TABLE PROVINCE (PID NUMBER PRIMARY KEY,PNAME VARCHAR(20) NOT NULL )SELECT * FROM PROVINCEINSERT INTO province VALUES (1, 北京市); INSERT I…

python的with关键字

with语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的“清理”操作&#xff0c;释放资源&#xff0c;比如文件使用后自动关闭、线程中锁的自动获取和释放等。with表达式其实是try-finally的简写形式。但是又不是全相同。 ""…

pgm2

MRF 笔记 我们先讨论引入 MRF 的必要性。经典的例子就是四个 r.v.s 连成一个正方形的结构的时候&#xff0c;我们没法通过 BN 获得给定对角线两个 r.v.s 而剩下的条件独立&#xff08;不都是 d-sep&#xff09;&#xff0c;反过来如果希望通过 MRF 刻画某些 BN 也是不可行的&am…

(六)ElasticSearch 6.1.1聚合查询

1 普通类型 1.1 基本操作 1.1.1 导入实战数据 数据字段如下&#xff1a; 字段类型作用pricelong汽车售价colortext汽车颜色maketext汽车品牌solddate销售日期 # 创建索引 PUT /cars {"mappings" : {"transactions" : {"properties" : {"…

12 Essential Bootstrap Tools for Web Designers

12 Essential Bootstrap Tools for Web Designers Posted by vikas on June 6, 2014, filed in: Tools, Web Design 原文地址&#xff1a;http://designzum.com/2014/06/06/12-best-bootstrap-tools-for-web-designers/Bootstrap is a great front end website development pla…

Sublime Text3自定义快捷键

转载于:https://www.cnblogs.com/shimily/articles/3783711.html

打jar包和执行jar包

使用eclipse打jar包 默认生成的目录在/Work/Projects/eclipse-workspace 执行 java -cp hellotest.jar com.feiyangedu.sample.Main java -cp testtesttest.jar com.feiyangedu.sample.Person out&#xff1a;print person java -cp testtesttest.jar com.feiyangedu.sample.…

受限波尔兹曼机

1. 概述 前面描述的神经网络模型是一种确定的结构。而波尔兹曼网络是一种随机网络。如何来描述一个随机网络呢&#xff1f;很多书上有大量的篇幅介绍其原理。这里把它总结为以下两点。 第一&#xff0c;概率分布函数。由于网络节点的取值状态是随机的&#xff0c;从贝叶斯网的…

推荐20款基于 jQuery CSS 的文本效果插件

jQuery 和 CSS 可以说是设计和开发行业的一次革命。这一切如此简单&#xff0c;快捷的一站式服务。jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力&#xff0c;要感谢那些优秀的 jQuery 插件。 所以今天我们将展示一些很酷的文本效果插件&#xff0…