JavaWeb-07-WEB的监听器和cookie以及session以及Filter过滤器

Table of Contents

 

监听器和cookie以及session

五:监听器

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.5:浏览器查看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拦截路径


监听器和cookie以及session

五:监听器

1 、什么是 Listener 监听器

什么是监听器?监听器就是实时监视一些事物状态的程序,我们称为监听器。就好像朝阳群众?朝阳区只要有哪个明星有什么不好的事,他们都会知道,然后举报。
那么朝阳群众就是监听器,明星就是被监视的事物,举报就是响应的内容。又或者说是,电动车的报警器。当报警器锁上的时候。我们去碰电动车,电动车就会报警。报警器,就是监听器,电动车就是被监视的对象。报警就是响应的内容。

 

1、Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监
听器。
2、Listener 它是 JavaEE 的规范,就是接口
3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

2 、ServletContextListener 监听器

ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。
ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。

监听器的使用步骤。

第一步:我们需要定义一个类。然后去继承生命周期的监听器接口。
第二步:然后在 Web.xml 文件中配置。

2.1:ServletContextListener 监听器,一定要在 web.xml 文件中配置之后才会生效


全类名

 

2.2:生命周期监听器两个方法:

JavaWeb-07-WEB的监听器和cookie以及session以及Filter过滤器_第1张图片

我们以 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
    

 

JavaWeb-07-WEB的监听器和cookie以及session以及Filter过滤器_第2张图片

六:Cookie

1:Cookie

1.1:什么是 Cookie?

1、Cookie 翻译过来是饼干的意思。
2、Cookie 是服务器通知客户端保存键值对的一种技术。
3、客户端有了 Cookie 后,每次请求都发送给服务器。
4、每个 Cookie 的大小不能超过 4kb

1.2:如何创建 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("我知道了,回去吧");
        //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.3:服务器如何获取 Cookie

服务器获取客户端的 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.4:Cookie 值的修改 值的修改

方案一:
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);
}

1.5:浏览器查看cookie

 

1.6: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);

六:Session会话

1:什么是 Session  会话?

1、Session 就一个接口(HttpSession)。
2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个 Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。

2:如何创建 Session  和获取(id  号, 是否为新)

如何创建和获取 Session。它们的 API 是一样的。

2.1request.getSession()

第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。

2.2:isNew(); 判断到底是不是刚创建出来的(新的)

true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。

2.3:getId() 得到 Session 的会话 id 值。

3:Session 域数据的存取

3.1:向Session中存数据

req.getSession().setAttribute("key1", "value1");
resp.getWriter().write(" 已经往 Session  中保存了数据");

3.2:从Session中取数据

Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从 从 Session  中获取出 key1  的数据是:" + attribute);

4:Session 生命周期控制

  • public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。

值为正数的时候,设定 Session 的超时时长。
负数表示永不超时(极少使用)

  • public int getMaxInactiveInterval()获取 Session 的超时时间
  • public void invalidate() 让当前 Session 会话马上超时无效

4.1Session 默认的超时时长是多少!Session 默认的超时时间长为 30 分钟。

因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session
超时配置默认时长为:30 分钟。

30

4.2:修改默认Session超时时间

如果说。你希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长



20

 

4.3:设置Session超时时间

如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。

// 先获取 Session 对象
HttpSession session = req.getSession();
// 设置当前 Session3 秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write(" 当前 Session  已经设置为 3  秒后超时");

 

5:  浏览器和 Session 之间关联的技术内幕

Session 技术,底层其实是基于 Cookie 技术来实现的

 

七:Filter 过滤器

1:什么是Filter过滤器

1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
2、Filter 过滤器它是 JavaEE 的规范。也就是接口
3、Filter 过滤器它的作用是: 拦截请求,过滤响应。

拦截请求常见的应用场景有:
1、权限检查
2、日记操作
3、事务管理
……等等

2:简单体验Filter

要求:在你的 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工作流程

JavaWeb-07-WEB的监听器和cookie以及session以及Filter过滤器_第3张图片

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
        
        /**
    

3:Filter 生命周期

Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法
第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法
第 3 步,每次拦截到请求,就会执行
4、destroy 销毁
第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

4:FilterConfig 类

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());
}

5:FilterChain 过滤链

Filter 过滤器
Chain 链,链条
FilterChain 就是过滤器链(多个过滤器如何一起工作)

JavaWeb-07-WEB的监听器和cookie以及session以及Filter过滤器_第4张图片

6:Filter拦截路径

--精确匹配 精确匹配
/target.jsp
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
--目录匹配 目录匹配
/admin/*
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
--后缀名匹配 后缀名匹配
*.html
以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
*.do
以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
*.action
以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!! 

 

 

 

你可能感兴趣的:(JavaWeb,java,过滤器,servlet,session)