Table of Contents
五:监听器
1 、什么是 Listener 监听器
2 、ServletContextListener 监听器
2.1:ServletContextListener 监听器,一定要在 web.xml 文件中配置之后才会生效
2.2:生命周期监听器两个方法:
六:Cookie
1:Cookie
1.1:什么是 Cookie?
1.2:如何创建 Cookie
1.3:服务器如何获取 Cookie
1.4:Cookie 值的修改 值的修改
1.6:Cookie 生命控制
六:Session会话
1:什么是 Session 会话?
2:如何创建 Session 和获取(id 号, 是否为新)
2.1request.getSession()
2.2:isNew(); 判断到底是不是刚创建出来的(新的)
2.3:getId() 得到 Session 的会话 id 值。
3:Session 域数据的存取
3.1:向Session中存数据
3.2:从Session中取数据
4:Session 生命周期控制
4.1Session 默认的超时时长是多少!Session 默认的超时时间长为 30 分钟。
4.2:修改默认Session超时时间
4.3:设置Session超时时间
5: 浏览器和 Session 之间关联的技术内幕
七:Filter 过滤器
1:什么是Filter过滤器
2:简单体验Filter
3:Filter 生命周期
4:FilterConfig 类
5:FilterChain 过滤链
6:Filter拦截路径
什么是监听器?监听器就是实时监视一些事物状态的程序,我们称为监听器。就好像朝阳群众?朝阳区只要有哪个明星有什么不好的事,他们都会知道,然后举报。
那么朝阳群众就是监听器,明星就是被监视的事物,举报就是响应的内容。又或者说是,电动车的报警器。当报警器锁上的时候。我们去碰电动车,电动车就会报警。报警器,就是监听器,电动车就是被监视的对象。报警就是响应的内容。
1、Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监
听器。
2、Listener 它是 JavaEE 的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。
ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
监听器的使用步骤。
第一步:我们需要定义一个类。然后去继承生命周期的监听器接口。
第二步:然后在 Web.xml 文件中配置。
我们以 ServletContext 的监听器为例演示如下:
package com.wkl.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Description:
* Date: 2020/6/14 - 下午 10:53
* author: wangkanglu
* version: V1.0
*/
public class SerletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext 对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext 对象被销毁了");
}
}
HelloServlet
com.wkl.servlet.HelloServlet
username
root
HelloServlet
/hello
com.wkl.listener.SerletContextListener
1、Cookie 翻译过来是饼干的意思。
2、Cookie 是服务器通知客户端保存键值对的一种技术。
3、客户端有了 Cookie 后,每次请求都发送给服务器。
4、每个 Cookie 的大小不能超过 4kb
package com.wkl.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Description:
* Date: 2020/6/14 - 下午 9:10
* author: wangkanglu
* version: V1.0
*/
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("我知道了,回去吧");
//1 创建 Cookie 对象
Cookie cookie = new Cookie("key4", "value4");
//2 通知客户端保存 Cookie
resp.addCookie(cookie);
//1 创建 Cookie 对象
Cookie cookie1 = new Cookie("key5", "value5");
//2 通知客户端保存 Cookie
resp.addCookie(cookie1);
resp.getWriter().write("Cookie 创建成功");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet的post方法被请求了。。。");
}
}
服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[]
package com.wkl.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Description:
* Date: 2020/6/14 - 下午 9:10
* author: wangkanglu
* version: V1.0
*/
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("我知道了,回去吧");
//获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
getName 方法返回 Cookie 的 key (名)
getValue 方法返回 Cookie 的 value 值
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]
");
}
//1 创建 Cookie 对象
Cookie cookie = new Cookie("key4", "value4");
//2 通知客户端保存 Cookie
resp.addCookie(cookie);
//1 创建 Cookie 对象
Cookie cookie1 = new Cookie("key5", "value5");
//2 通知客户端保存 Cookie
resp.addCookie(cookie1);
resp.getWriter().write("Cookie 创建成功");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet的post方法被请求了。。。");
}
}
方案一:
1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
2、在构造器,同时赋于新的 Cookie 值。
3、调用 response.addCookie( Cookie );
Cookie cookie = new Cookie("key1","newValue1");
// 3 、调用 response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);
方案二:
1、先查找到需要修改的 Cookie 对象
2、调用 setValue()方法赋于新的 Cookie 值。
3、调用 response.addCookie()通知客户端保存修改
方案二:
// 1 、先查找到需要修改的 Cookie 对象
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2 、调用 setValue() 方法赋于新的 Cookie 值。
cookie.setValue("newValue2");
// 3 、调用 response.addCookie() 通知客户端保存修改
resp.addCookie(cookie);
}
setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
零,表示马上删除 Cookie
Cookie cookie = new Cookie("life3600", "life3600");
cookie.setMaxAge(60 * 60); // 设置 Cookie 一小时之后被删除。无效
resp.addCookie(cookie);
resp.getWriter().write(" 已经创建了一个存活一小时的 Cookie");
// 先找到你要删除的 Cookie 对象
Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
if (cookie != null) {
// 调用 setMaxAge(0);
cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
// 调用 response.addCookie(cookie);
resp.addCookie(cookie);
resp.getWriter().write("key4 的 的 Cookie 已经被删除");
}
Cookie cookie = new Cookie("defalutLife","defaultLife");
cookie.setMaxAge(-1);// 设置存活时间
resp.addCookie(cookie);
1、Session 就一个接口(HttpSession)。
2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个 Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。
如何创建和获取 Session。它们的 API 是一样的。
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
req.getSession().setAttribute("key1", "value1");
resp.getWriter().write(" 已经往 Session 中保存了数据");
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从 从 Session 中获取出 key1 的数据是:" + attribute);
值为正数的时候,设定 Session 的超时时长。
负数表示永不超时(极少使用)
因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session
超时配置默认时长为:30 分钟。
如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长
20
如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。
// 先获取 Session 对象
HttpSession session = req.getSession();
// 设置当前 Session3 秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write(" 当前 Session 已经设置为 3 秒后超时");
Session 技术,底层其实是基于 Cookie 技术来实现的
1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
2、Filter 过滤器它是 JavaEE 的规范。也就是接口
3、Filter 过滤器它的作用是: 拦截请求,过滤响应。
拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
……等等
要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必
须是用户登录之后才允许访问。
思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否
登录,可以判断 Session 中否包含有用户登录的信息即可!!!
<%
Object user = session.getAttribute("user");
// 如果等于 null ,说明还没有登录
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
%>
Fiter工作流程
package com.wkl.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* Description:
* Date: 2020/6/15 - 上午 12:01
* author: wangkanglu
* version: V1.0
*/
public class loginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null ,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/hello").forward(servletRequest, servletResponse);
return;
} else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
AdminFilter
com.wkl.filter.loginFilter
AdminFilter
/**
Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、获取 Filter 的名称 filter-name 的内容
2、获取在 Filter 中配置的 init-param 初始化参数
3、获取 ServletContext 对象
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("2.Filter 的 的 init(FilterConfig filterConfig) 初始化");
// 1 、获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是:" + filterConfig.getFilterName());
// 2 、获取在 web.xml 中配置的 init-param 初始化参数
System.out.println(" 初始化参数 username 的值是 :" + filterConfig.getInitParameter("username"));
System.out.println(" 初始化参数 url 的值是:" + filterConfig.getInitParameter("url"));
// 3 、获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}
Filter 过滤器
Chain 链,链条
FilterChain 就是过滤器链(多个过滤器如何一起工作)
--精确匹配 精确匹配
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
--目录匹配 目录匹配
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
--后缀名匹配 后缀名匹配
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!