JAVA 基础会话技术 Cookie和 Session 详解(一)(小白必学)

会话技术

会话:
     1. 概念:
         一次会话中包含多次请求和响应.
        一次会话:
         浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
     2.功能:
     再一次会话范围内的多次请求间,数据共享
     3.方式:
       1.客户端会话技术 :Cookie
                
       2.服务器端会话技术. :session

Cookie

1.概念
    客户端的会话技术,将数据保存到客户端。
2.快速入门
   **使用步骤**
      1. 创建 Cookie对象,绑定数据
           new Cookie(String name,String value);
      2. 发送 Cookie 对象
           response.addCookie();
      3. 获取Cookie,拿到数据
                request.getCookies();

代码示例:

      package cookie;

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(name = "/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //创建Cookie d对象
        Cookie cookie = new Cookie("msg","hello");

        //发送

        response.addCookie(cookie);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

package cookie;

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( "/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("post============");
        Cookie[] cookies = request.getCookies();

        if(cookies != null){

            for (Cookie cookie :cookies){

                String name = cookie.getName();
                String value = cookie.getValue();

                System.out.println(name+"====value="+value);

            }
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

cookie 原理

基于响应头 set-cookie 和请求头 getCookie 实现的

在这里插入图片描述

cookie 的细节问题

  1. 一次可不可以发送多个cookie?

      可以,可以创建多个Cookie对象,使用 response 调用多次addCookie 方法发送 cookie
    
  2. cookie 在浏览器中保存多少时间?

      1. 默认情况下,当浏览器关闭后,cookie数据就被销毁
      2. 持久化存储
             setMaxAge(int  seconds);
                 1. 整数 : 将cookie数据写到硬盘的文件中,持久化存储
                 2. 负数 :  默认值;浏览器已关闭,就没有信息。
                 3. 零: 删除cookie信息
    
  3. cookie 能不能存储 中文?

    在tomcat 8 之前  cookie  不能直接存中文数据,
    在Tomcat 8之后 cookie 支持中文数据。
    
  4. cookie 共享问题?

    1. 假设在一个tomcat部署了多个 web项目,那么在这些web项目中cookie能不能共享?
      默认情况下 cookie 是不能共享的

      setpath(String path) :设置cookie的获取范围;默认情况下设置当前的虚拟目录;
      如果需要共享,则可以将 path设置为 “/”

    2. 不同的 tomcat 服务器 间 如何设置 cookie 共享?
      setDomain(String path): 如果设置一级域名相同,那么多个服务器间 cookie 可以共享
      例如 setDomain(“.baidu.com ”) 那么 tieba.baidu.com 和 new.baidu.com 之间可以实现 coolie共享

cookie 的特点 和 作用

  1. cookie 存储数据在 客户端 浏览器;
  2. 浏览器对单个cookie 的大小有限制 以及 对同一个域名下的总 cookie 数量 有限制

作用:

  1. cookie 一般用于存储少量的不太敏感的数据
  2. 在不登录的情况下,完成服务器对客户端身份的识别

cookie 案例

package cookieDemo;

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 javax.xml.crypto.Data;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;

/**
*模拟 用户登录 
     1.第一次登录 没有cookie 返回 欢迎登录
     2 第二次 登录 有 cookie  显示 欢迎再次登录,以及上次登录时间
*/
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       response.setContentType("text/html;charset=utf-8");
       Date data = new Date();

       SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd");

       String format = simpleDateFormat.format(data);

       Cookie[] cookies = request.getCookies();

       boolean flag=false;

       if (cookies != null && cookies.length > 0) {

           for (Cookie cookie : cookies) {

               String name = cookie.getName();

               if ("lastTime".equals(name)) {

                   String value = cookie.getValue();

                   response.getWriter().write("欢迎再次归来,上次访问的时间是:" + value);

                   cookie.setValue(format);

                   cookie.setMaxAge(60*60*24*30);

                   response.addCookie(cookie);
                   flag =true;
                   break;
               }
           }


       }


       if (cookies == null || cookies.length == 0 ||  flag == false){

           Cookie cookie1 = new Cookie("lastTime", format);


           cookie1.setMaxAge(60*60*24*30);

           response.addCookie(cookie1);

           response.getWriter().write("欢迎第一次归来");


       }


   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       this.doPost(request, response);
   }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值