Cookie讲解

会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过称为有状态会话

服务端怎么证明客户端来过

  1. 服务端给客户端一个信件,服务器下次访问的时候带上信件就可以了。cookie
  2. 服务器登记你来过,下次来的时候我匹配你。session

保存会话的两种技术

客户端技术(响应,请求)

session

服务器技术,利用这个技术可以保留用户的会话信息,我们可以把信息或者数据放在session中

常见场景:

网络登录之后,第二次访问直接就可以进去

cookie

屏幕截图 2025-09-07 151441

一般会保存在本地的用户目录下appdata

  1. 从请求中拿到cookie信息
    2。 服务器响应到客户端
package com.xin.servlet;

import javafx.scene.chart.PieChart;

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

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器给一个你来的时间,封装成信件,下次带着信件来就可以了
        req.setCharacterEncoding("utf-16");
       resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        //cookie,服务端从客户端获取,从请求里拿到cookie.

        Cookie[] cookies = req.getCookies();//获得cookie。这里返回数组,说明cookie可能存在多个
        //判断cookie是否存在
        if(cookies!=null){
            //如果存在
            out.write("你上一次访问的时间是:");
            for(int i=0;i<cookies.length;i++){
                Cookie cookie = cookies[i];
                //获取cookie的名字,getName(),获得cookie中的key
                if ( cookie.getName().equals("LastLoginTime")){
                    //获取cookie的值,并转化成长整型.long是包装类的
                    //把字符串变成时间
                    //有key就有value
                    long LastLoginTime = Long.parseLong(cookie.getValue());
                    //把时间变成字符串,new一个对象
                    Date date = new Date(LastLoginTime);
                    //用out写出去
                    out.write(date.toLocaleString());

                }

            }

        }else {
            //基本不会出,因为浏览器的cookie不会为null,容器依然存在
            out.write("这是您第一次访问本站");
        }
        //服务器给客户端响应cookie,新建一个cookie
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
     //cookie有效期为一天,以秒为单位
        //expire:有效期
       cookie.setMaxAge(24*60*60);
        //响应给客户端,也可以响应多个
        resp.addCookie(cookie );

    }

**一个网站的cookie是否存在上限?

  1. 一个cookie只能保存一个信息
  2. 一个web网站可以给浏览器可以发送多个cookie,最多可以存放20个cookie
  3. cookie大小有限制40kb
  4. 300个cookie浏览器上限

删除cookie

  1. 不设置有效期,关闭浏览器,自动失效
  2. 设置有效期时间为0.比如新建demo02。启动就类似清除了cookie,重新启动的时候没有上一次的访问时间
//创建一个cookie,名字要和要删除的名字一致
Cookie cookie new Cookie("lastlogintime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
resp.addCookie(cookie);

中文数据传递

package com.xin.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;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-16");
        resp.setContentType("text/html;charset=utf-8");


        Cookie[] cookies = req.getCookies();
        PrintWriter out = resp.getWriter();
        resp.getWriter();

        if (cookies!=null){
            out.write("你上一次访问的时间");
            for (int i= 0;i<cookies.length;i++){
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("name")){
                    System.out.println(cookie.getValue());
                   URLDecoder.decode(cookie.getValue(),"UTF-8");
                  out.write(cookie.getValue());
                }
            }
        }
        else {
            out.write("第一次访问");
        }
      //  Cookie cookie = new Cookie("name","熙熙");
        Cookie cookie = new Cookie("name", URLEncoder.encode("熙熙","utf-8"));
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

以下方法:

//编码
 Cookie cookie = new Cookie("name", URLEncoder.encode("熙熙","utf-8"));
 //解码
URLDecoder.decode(cookie.getValue(),"UTF-8");
                  out.write(cookie.getValue());

还有一种就是把 响应和请求的编码设置改成:utf-16

控制台输出乱码

给tomcat的vm配置中输入
-Dfile.encoding=UTF-8
image

posted @ 2025-09-06 15:49  xixixixin  阅读(10)  评论(0)    收藏  举报