web-day16
第16章WEB16-Listener&Filter篇
今日任务
- 使用过滤器完成自动登录的案例
- 使用过滤器统一网站的字符集编码
教学导航
教学目标 |
了解常见的监听器 理解过滤器的生命周期 能够使用过滤器完成自动登录 使用过滤器解决get和post的乱码 |
教学方法 |
案例驱动法 |
1.1 上次课内容回顾:
AJAX:
* AJAX:异步的JavaScript And XML.
* XMLHttpRequest:
* 属性:
* onreadystatechange :当对象的状态改变的时候会触发.
* readyState :记录的是对象的状态.
* status :状态码.
* responseText :响应文本.
* responseXML :响应的XML.
* 方法:
* open(“请求方式”,”请求路径”,true);
* send(“请求参数”);
* setRequestHeader(“头名称”,”头的值”);
JQuery中的AJAX:
* load();
* get();
* post();
* ajax();
* $.ajax({
url:,
data:,
success:function(){
}
});
* AJAX中的数据的格式:
* 文本,HTML代码,XML,JSON.
1.2 监听器:Listener
1.2.1 监听器的概述:
1.2.1.1 什么是监听器:
* 监听器:就是一个Java类,用来监听其他的Java的状态的变化.
1.2.1.2 监听器的用途:
* 用来监听其他的对象的变化的.
* 主要应用在图形化界面中比较多:
* GUI,Android.
1.2.1.3 监听器的术语:
* 事件源:指的是被监听的对象.(汽车)
* 监听器:值的是监听的对象.(报警器)
* 事件源与监听器的绑定:就是在汽车上安装报警器.
* 事件:指的是事件源的改变.(踹汽车一脚)---主要的功能获得事件源对象.
1.2.2 WEB中的监听器的概述:
1.2.2.1 WEB中的监听器:
WEB中的Listener和Filter是属于Servlet规范中的高级的技术.
WEB中的监听器共有三类八种(监听三个域对象)
* 事件源:Servlet中的三个域对象.ServletContext,HttpSession,ServletRequest.
* 监听器:自定义类实现8个接口.
* 事件源和监听器的绑定:配置.
1.2.2.2 WEB中的监听器的分类:
三类八种:
* 一类:监听三个域对象的创建和销毁的监听器:
* ServletContextListener
* HttpSessionListener
* ServletRequestListener
* 二类:监听三个域对象的属性变更的监听器(属性添加,移除,替换):
* ServletContextAttributeListener
* HttpSessionAttributeListener
* ServletRequestAttributeListener
* 三类:监听HttpSession中的JavaBean的状态改变(绑定,解除绑定,钝化,活化)
* HttpSessionBindingListener
* HttpSessionActivationListener
1.2.2.3 WEB中的监听器的使用:
编写一个类实现监听器的接口:
通过配置文件配置监听器:
1.2.3 一类:监听三个域对象的创建和销毁的监听器:
1.2.3.1 ServletContextListener:监听ServletContext对象的创建和销毁:
【方法】:
【ServletContext对象的创建和销毁】:
* 创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext.
* 销毁:服务器关闭或者项目从服务器中移除的时候.
【应用代码】
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了...");
}
}
配置:
<!-- 配置监听器 -->
<listener>
<listener-class>com.itheima.weblistener.MyServletContextListener</listener-class>
</listener>
【企业中的应用:】
* 1.加载框架的配置文件 :Spring框架 ContextLoaderListener
* 2.定时任务调度:
* Timer,TimerTask
1.2.3.2 HttpSessionListener:监听HttpSession的创建和销毁的监听器:
【方法】
【HttpSession何时创建和销毁的】
* 创建:服务器端第一次调用getSession();
* 销毁:
* 非正常关闭服务器(正常关闭session会序列化):
* session过期了默认30分钟.
* 手动调用session.invalidate();
【HttpSession的问题】
* 访问Servlet会不会创建Session : 不会
* 访问JSP会不会创建Session :会.
* 访问html会不会创建Session :不会
【应用的代码】
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession被创建了...");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession被销毁了...");
}
}
配置:
<listener>
<listener-class>com.itheima.weblistener.MyHttpSessionListener</listener-class>
</listener>
1.2.3.3 ServletRequestListener:监听ServletRequest对象的创建和销毁的监听器:
【方法】:
【request对象何时创建和销毁】:
* 创建:客户端向服务器发送一次请求,服务器就会创建request对象.
* 销毁:服务器对这次请求作出响应后就会销毁request对象.
【问题】:
访问一个Servlet会不会创建request对象:会
访问一个JSP会不会创建request对象:会
访问一个HTML会不会创建request对象:会
【应用的代码】
public class MyServletRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest被销毁了...");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest被创建了...");
}
}
配置:
<listener>
<listener-class>com.itheima.weblistener.MyServletRequestListener</listener-class>
</listener>
1.2.4 二类:监听三个域对象的属性变更的监听器:(属性添加,移除,替换)
1.2.4.1 ServletContextAttributeListener:监听ServletContext对象的属性变更:
1.2.4.2 HttpSessionAttributeListener:监听HttpSession中的属性变更:
1.2.4.3 ServletRequestAttributeListener:监听ServletRequest对象的属性变更的:
1.2.5 三类:监听HttpSession中的JavaBean的对象的状态改变的监听器
第三类监听器很特殊,不需要进行配置的.作用在JavaBean上的监听器.JavaBean可以自己感知到在Session中的状态.
1.2.5.1 HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定和解除绑定的
1.2.5.2 HttpSessionActivationListener:监听HttpSession中的JavaBean的钝化和活化的.
* sessionDidActivate(); :--活化(反序列化)
* sessionWillPassivate(); :--钝化(序列化到硬盘)
***** 优化Session:
* 通过配置<Context>标签配置定时session序列化.
* 在tomcat/conf/context.xml中配置<Context> :在tomcat中所有的虚拟主机和虚拟路径都会按照这个配置执行.
* 在tomcat/conf/Catalina/localhost/context.xml配置<Context> :在tomcat中的localhost虚拟主机中的所有虚拟路径按照这个配置执行.
* 在当前的工程下的META-INF/context.xml配置<Context> :当前这个工程按照配置执行.
1.3 案例一:自动登录案例.
1.3.1 需求:
在各式网站都会看到自动登录的功能,在登录页面中勾选了自动登录的复选框,那么下次访问网站首页的时候,可以不需要进行登录.
1.3.2 分析:
1.3.2.1 技术分析:
【Cookie技术】
* 利用Cookie记住用户的用户名和密码.
【Filter:过滤器的概述】
- 什么是过滤器Filter:可以过滤从客户端向服务器发送的请求.
- 过滤器的使用:
* 进行IP的过滤,脏话过滤,自动登录,响应压缩...
- 使用过滤器:
* 编写一个类实现Filter接口:
* 配置过滤器:
【过滤器的生命周期】:了解
- 过滤器的创建和销毁:
* 创建:服务器启动的时候.
* 销毁:服务器关闭的时候.
【FilterConfig:过滤器的配置对象】:
代码:
public void init(FilterConfig filterConfig) throws ServletException {
// 获得当前的Filter的名称:
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
// 获得初始化参数:
String username = filterConfig.getInitParameter("username");
String password = filterConfig.getInitParameter("password");
System.out.println(username+" "+password);
// 获得所有的初始化参数的名称:
Enumeration<String> en = filterConfig.getInitParameterNames();
while(en.hasMoreElements()){
String name = en.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name+" "+value);
}
}
【FilterChain:过滤器链】
过滤器链中的过滤器的执行的顺序与<filter-mapping>的配置顺序有关.
* doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
【Filter相关的配置】
- <url-pattern>的配置:
* 完全路径匹配 :以 / 开始 /demo4/demo1.jsp
* 目录匹配 :以 / 开始 以 * 结束. /* /demo1/*
* 扩展名匹配 :不能以 / 开始 以 * 开始. *.do *.action
- <servlet-name>的配置:根据Servlet的名称拦截Servlet.
- <dispatcher>的配置:
* REQUEST :默认值.
* FORWARD :转发.
* INCLUDE :包含.
* ERROR :错误页面跳转.(全局错误页面)
1.3.3 代码实现:
【步骤一】:创建数据库和表:
create database web_16;
use web_16;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20),
type varchar(10)
);
insert into user values (null,'aaa','111','张凤','user');
insert into user values (null,'bbb','111','如花','user');
insert into user values (null,'ccc','111','张芙蓉','user');
【步骤二】:导入jar包和工具类:
【步骤三】:创建包结构及常用类:
【步骤四】:登录功能.
【步骤五】:利用COokie记住用户名和密码
【步骤六】:实现自动登录的过滤器
1.4 案例二:通用的字符集编码的过滤器.
1.4.1 需求:
在一个网站上,通常会提交带有中文的数据,GET/POST请求都有可能提交中文数据.通常情况下在Servlet中处理中文乱码.现在能不能将乱码的处理交给过滤器完成.只需要在Servlet中关心参数的接收就可以了.
只需要在Servlet中调用request.getParameter();接收参数就可以,而不去关心到底get/post如何处理乱码.
1.4.2 分析:
【增强request中的getParameter方法】
- 继承 :控制这个类构造.
- 装饰者模式 :增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用.
* 缺点:接口中方法太多.
- 动态代理 :被增强的类实现接口就可以.
1.4.3 代码实现:
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
// 根据请求方式不同,去处理:
// 获得请求方式:
String method = request.getMethod();
if("get".equalsIgnoreCase(method)){
String value = null;
try {
value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}else if("post".equalsIgnoreCase(method)){
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
}
web-day16的更多相关文章
- 撩课-Web大前端每天5道面试题-Day16
1.for循环中的作用域问题? 写出以下代码输出值,尝试用es5和es6的方式进行改进输出循环中的i值. ; i<=; i++) { setTimeout(function timer() { ...
- day16 web前端之JavaScript
页面布局补充 样例页面: 示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- python_way day16 DOM
Python_way day16 1.Dom (找到html中的标签) 一.DOM 1.查找元素 直接查找 document.getElementById 根据ID获取一个标签 --->这里是 ...
- web笔记全
1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...
- Web核心之会话技术Cookie&Session
什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...
- C# Web应用调试开启外部访问
在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...
- 网页提交中文到WEB容器的经历了些什么过程....
先准备一个网页 <html><meta http-equiv="Content-Type" content="text/html; charset=gb ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- java: web应用中不经意的内存泄露
前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
随机推荐
- Soa思想分布式服务webservice WCF
什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这 ...
- 对于devexpress gridview 内插图加加进度条等的一点解读
如上图,gategory 加了小图标, 其他行内还有计算器,大图片 进度条等 using System; using System.Drawing; using System.Collection ...
- DevExpress如何实现皮肤的添加及本地化
DevExpress.XtraBars.Helpers.SkinHelper类允许您填充现有RibbonGalleryBarItem或任意菜单(PopupMenu或BarSubItem)项目对应的De ...
- 可以搜索局域网内的所有IP地址的软件
几乎都用现有的工具,直接扫描,这里我已python为例,搜索一下局域网内所有活动IP,基本原理就是ping,对返回的结果进行分析,从而判断对应ip是否活动,代码很简单,实验环境win10+python ...
- Luogu 3119 [USACO15JAN]草鉴定Grass Cownoisseur
思路很乱,写个博客理一理. 缩点 + dp. 首先发现把一个环上的边反向是意义不大的,这样子不但不好算,而且相当于浪费了一次反向的机会.反正一个强连通分量里的点绕一遍都可以走到,所以我们缩点之后把一个 ...
- C/C++常用预处理指令
预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查.预处理命令以符号“#”开头. 常用的预处理指令包括: 宏定义:#define 文件包含:#include 条件编译:#i ...
- word2vec_训练模型
from gensim.models import Word2Vecfrom gensim.models.word2vec import LineSentence # 原始的训练语料转化成一个sent ...
- Snownlp
from snownlp import SnowNLP text='宝贝自拍很帅!!!注意休息-' s=SnowNLP(text) #分词print(s.words) #词性for tag in s. ...
- 修改电脑自动休眠时间win10
https://jingyan.baidu.com/article/adc81513a481cdf723bf73e6.html
- 《从0到1》深度阅读笔记zz
没有人能精准地预测未来,我们只知道两件事:一是世界必然会变得不同:二是现在再好的描述也不能让我们看到清晰的未来. 创业者把成就归功于商业模式和机会窗口,归功于创业者本人拥有的资源和能力,但还有一个最重 ...