HttpSession 与 Cookie 区别与监听器接口【最终篇】

131 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解HttpSession 与 Cookie 区别与监听器接口,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

HttpSession 与 Cookie 区别

 1'存储位置':  一个在天上,一个在地下
 Cookie:存放在客户端计算机(浏览器内存/硬盘)
 HttpSession:存放在服务端计算机内存
 ​
 2'数据类型':
 Cookie对象存储共享数据类型只能是String
 HttpSession对象可以存储任意类型的共享数据Object
 ​
 3) '数据数量':
 一个Cookie对象只能存储一个共享数据
 HttpSession使用map集合存储共享数据,所以可以
 存储任意数量共享数据
 ​
 4'参照物':
 Cookie相当于客户在服务端【会员卡】
 HttpSession相当于客户在服务端【私人保险柜】
getSession() 与 getSession(false)
 1getSession(): 如果当前用户在服务端已经拥有了自己的私人储物柜.
     要求tomcat将这个私人储物柜进行返回
     如果当前用户在服务端尚未拥有自己的私人储物柜
     要求tocmat为当前用户创建一个全新的私人储物柜
 ​
 2)getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜.
     要求tomcat将这个私人储物柜进行返回
     如果当前用户在服务端尚未拥有自己的私人储物柜
     此时Tomcat将返回null

HttpServletRequest数据共享

 1.介绍:
     1) 在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,
     彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象
     因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个
     Servlet之间实现数据共享
     2) 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
 ​
 2.命令实现: OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
     OneServlet{
         public void doGet(HttpServletRequest req,HttpServletResponse response){
         //1.将数据添加到【请求作用域对象】中attribute属性
         req.setAttribute("key1",数据); //数据类型可以任意类型Object
         //2.向Tomcat申请调用TwoServlet
         req.getRequestDispatcher("/two").forward(req,response)
         }
     }
     TwoServlet{
         public void doGet(HttpServletRequest req,HttpServletResponse response){
         //从当前请求对象得到OneServlet写入到共享数据
         Object 数据 = req.getAttribute("key1");
         }
     }

监听器接口

  1.介绍:
          1)一组来自于Servlet规范下接口,共有8个接口。在Tomcat存在servlet-api.jar包
 ​
           2)监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
 ​
           3)监听器接口用于监控'作用域对象生命周期变化时刻'以及'作用域对象共享数据变化时刻'
  2.作用域对象:
            1)在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供
               数据共享方案的对象,被称为【作用域对象】
 ​
               2)Servlet规范下作用域对象:
                ServletContext:   全局作用域对象
                HttpSession   :    会话作用域对象
                HttpServletRequest:请求作用域对象
  3.监听器接口实现类开发规范:三步
 ​
        1)根据监听的实际情况,选择对应监听器接口进行实现
 ​
         2)重写监听器接口声明【监听事件处理方法】
 ​
         3)在web.xml文件将监听器接口实现类注册到Http服务器
 4.ServletContextListener接口:
 ​
         1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
 ​
         2)监听事件处理方法:
                 public void contextInitlized() :在全局作用域对象被Http服务器初始化被调用
 ​
                 public void contextDestory():      在全局作用域对象被Http服务器销毁时候触发调用
  5.ServletContextAttributeListener接口:
 ​
          1)作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
 ​
          2)监听事件处理方法:
                   public void contextAdd():在全局作用域对象添加共享数据
                  public void contextReplaced():在全局作用域对象更新共享数据
                  public void contextRemove():在全局作用域对象删除共享数据
  6.全局作用域对象共享数据变化时刻
          ServletContext application = request.getServletContext();
 ​
         application.setAttribute("key1",100); //新增共享数据
 ​
         application.setAttribute("key1",200); //更新共享数据
 ​
         application.removeAttribute("key1");  //删除共享数据

Filter接口(过滤器接口)

  1.介绍:
            1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包
 ​
            2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供
 ​
            3)Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
  2.具体作用:
 ​
          1)拦截Http服务器,帮助Http服务器检测当前请求合法性
 ​
         2)拦截Http服务器,对当前请求进行增强操作
  3.Filter接口实现类开发步骤:三步
 ​
          1)创建一个Java类实现Filter接口
 ​
          2)重写Filter接口中doFilter方法
 ​
 4.Filter拦截地址格式
         1) 命令格式:
             <filter-mapping>
             <filter-name>oneFilter</filter-name>
             <url-pattern>拦截地址</url-pattern>
             </filter-mapping>
         2) 命令作用:
             拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截
 ​
         3)要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
             <url-pattern>/img/mm.jpg</url-pattern>
 ​
         4)要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
             <url-pattern>/img/*</url-pattern>
 ​
         5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
             <url-pattern>/*.jpg</url-pattern>
 ​
         6)要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
             <url-pattern>/*</url-pattern>

实例演示

302状态码

OneServlet
 package com.jinhuan.controller;
 ​
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 ​
 public class OneServlet extends HttpServlet {
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 ​
     }
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String address = "http://www.baidu.com";
         //通过响应体将address写入到响应头的location中
         response.sendRedirect(address);
         /**
          * 分析:
          * Tomcat在推送响应包之前,看到响应体是空的,但是响应头的location中却放了一个地址
          * 此时Tomcat将 302 状态码写入到状态行
          *在浏览器接收到响应包之后,因为302状态码,浏览器不会读取响应体,自动根据响应头中的location发送第二次请求
          * */
     }
 }
web.xml
   <servlet>
         <servlet-name>OneServlet</servlet-name>
         <servlet-class>com.jinhuan.controller.OneServlet</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>OneServlet</servlet-name>
         <url-pattern>/one</url-pattern>
     </servlet-mapping>