Servlet 学习总结(五)

一、session机制

1、什么是会话

  • 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。会话在服务器端也有一个对应的java对象,这个java对象叫做:session。
  • 一个会话当中包含多次请求。(一次会话对应N次请求。)
  • 在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)
  • session对象最主要的作用是:保存会话状态。

2、为什么需要session对象来保存会话状态呢?

  • 因为HTTP协议是一种无状态协议。
  • 什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就断了。这样的无状态协议,可以降低服务器的压力。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。

3、session的实现原理

  • HttpSession session = request.getSession();
  • JSESSIONID=xxxx 这个是以Cookie的形式保存在浏览器的内存中的。浏览器只要关闭。这个Cookie就没有了。
  • session列表是一个Map,map的key是sessionId,map的value是session对象
  • 用户第一次请求,服务器生成session对象,同时生成id,将id发送给浏览器。
  • 用户第二次请求,自动将浏览器内存中的id发送给服务器,服务器根据id查找session对象。
  • 关闭浏览器,内存消失,cookie消失,seesionid消失,会话等同于结束。

4、cookie禁用了,session机制还能实现吗?(了解)

  • 可以。需要使用URL重写机制。
  • 格式:http://localhost:8080/oa/;jsessionid=7A85650237204E0665F384D330F71CD5
  • URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分网站都是这样设计的:你要是禁用cookie,你就别用了。

5、session对象的几个常用方法

// 加了false的话,那获取不到session对象将不会新建,会返回null
HttpSession session = request.getSession(false);
// 手动销毁session对象
session.invalidate(); 
session.setAttribute (向域当中绑定数据)
session.getAttribute (向域当中获取数据)
session.removeAttribute (删除域当中的数据)

二、cookie机制

1、什么是cookie?

  • session的实现原理中,每一个session对象都会关联一个sessionid
  • 例如:JSEESSIONID=5432543256423625654262546452
  • 以上的这个键值对数据其实就是cookie对象。
  • 对于session关联的cookie来说,这个cookie是被保存在浏览器的“运行内存”当中。
  • 只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。
  • 例如,这个Cookie会再次发送给服务器。
  • 服务器就是根据5432543256423625654262546452这个值来找到对应的session对象的。

2、cookie最终保存在哪里?

  • cookie最终是保存在浏览器客户端上的。
  • 可以保存在运行内存中。(浏览器只要关闭cookie就消失了)
  • 也可以保存在硬盘文件中。(永久保存)

3、cookie有什么用呢?

  • cookie和session机制其实都是为了保存会话的状态。
  • cookie是将会话的状态保存在浏览器客户端上。(cookie数据存储在浏览器客户端上的)
  • session是将会话的状态保存在服务器上。(session对象是存储在服务器上)
  • 为什么要有cookie和session机制呢?因为HTTP协议是无状态协议,无连接协议。

4、怎么让cookie失效呢?

  • 清理浏览器cookie信息
  • 改密码
  • 等cookie过期

5、cookie和session机制都是属于HTTP协议的一部分。 HTTP协议中规定:任何一个cookie都是由name和value组成的,name和value都是字符串类型的。

6、在java的servlet中,对cookie提供了哪些支持呢?

提供了一个Cookie类来专门表示cookie数据:jakarta.servlet.http.Cookie;

7、java程序怎么把cookie数据发送给浏览器呢?

使用:response.addCookie(cookie);

8、在HTTP协议中是这样规定的:当浏览器发送请求的时候,会自动携带该path下的cookie数据给服务器(URL)

9、关于cookie的有效时间

// 设置cookie在一个小时之后失效
cookie.setMaxAge(60*60); 
  • 没有设置有效时间:默认保存在浏览器运行内存中,浏览器关闭则cookie消失。
  • 只要设置cookie的有效时间 > 0,这个cookie一定会存储到硬盘文件当中。
  • 设置cookie的有效时间=0呢?
    • cookie被删除,同名cookie被删除
  • 设置cookie的有效时间 < 0呢?
    • 保存在运行内存中,和不设置一样。

10、关于cookie的path,cookie关联的路径

11、手动设置cookie的path

  • cookie.setPath(“/servlet13”); 表示只要是这个servlet13项目的请求路径,都会提交这个cookie给服务器。

12、浏览器发送cookie给服务器了,服务器中的java程序怎么接收?

// 该数组的长度绝对是 >0的
Cookie[] cookies = request.getCookies(); // 这个方法可能返回null
if(cookies != null){
    for(Cookie cookie : cookies){
        // 获取cookie的name
        String name = cookie.getName();
        // 获取cookie的value
        String value = cookie.getValue();
    }
}

13、如何创建cookie?

package com.zikai.javaweb.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servlet/cookie")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 新建一个cookie对象
        Cookie cookie = new Cookie("userId", "56435654645645656");

        // 设置cookie的有效时间
        cookie.setMaxAge(60 * 60); // 一个小时

        //cookie.setMaxAge(0); // 表示删除cookie

        //cookie.setMaxAge(-1); // 保存到浏览器内存,浏览器关闭自动消失

        cookie.setPath(request.getContextPath());
        /*
            经过测试,如果不设路径的话,默认路径就是(项目名/servlet/...)
                而想测试是否保存了一个小时就得把路径改为项目路径测试,
                该cookie只会通过url的一些路径信息追踪到然后提交cookie
         */

        Cookie cookie1 = new Cookie("animalId","9981759873489");

        cookie1.setMaxAge(60 * 60);

        cookie1.setPath(request.getContextPath());

        // 响应到浏览器客户端
        response.addCookie(cookie);
        response.addCookie(cookie1);
    }
}

注意:session机制和cookie机制在其他语言也是适用的,属于HTTP协议。

总结:cookie机制和session机制都是为了保存会话状态的,而cookie信息是保存在客户端的,session对象是保存在服务器端的,两者的目的存在都是为了保存会话状态,因为HTTP协议是无连接协议,无状态协议。

自用小总结。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值