JavaWeb学习打卡11(session(会话)、cookie(甜点)详解)

发布于:2025-07-23 ⋅ 阅读:(12) ⋅ 点赞:(0)

Session(会话)

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

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

一个网站怎么证明你来过?

客户端          服务端

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

保存会话的两种技术

cookie

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

session

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

常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就登录了

Cookie

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户端cookie

cookie常用的方法:

Cookie[] cookies = req.getCookies(); //获得cookie
cookie.getName();  //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60);  //设置cookie有效期为24小时
resp.addCookie(cookie);//将cookie 响应回客户端

cookie 常用方法的使用:

package com.xu.cookie;

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.util.Date;

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成为也给信件 , 你下次带来,我就知道你来了

        //先解决中文乱码问题
        req.setCharacterEncoding("utf-8");
        // 如果写 resp.setCharacterEncoding("utf-8");还是显示乱码,就将resp 代码改为:resp.setContentType("text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //创建一个输出流对象
        PrintWriter out = resp.getWriter();

        //Cookie,是服务端从客户端获取的
        Cookie[] cookies = req.getCookies();//这里是返回数组,说明Cookie可能存在多个

        //判断Cookie 是否存在
        if(cookies!= null){  //判断Cookie 不为空, 则不是第一次访问
            //cookie 存在
            out.write("你上次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie 的名字
                if (cookie.getName().equals("lastLoginTime")){
                    //获取cookie 中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }

        }else {
            out.write("这是您第一次访问本站");
        }

        //服务端给客户端响应(发送)一个cookie
        //先new一个cookie ,name为:lastLoginTime  ;value为:最后一次访问的时间戳
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");

        //设置cookie有效期为一天
        cookie.setMaxAge(24*60*60);

        resp.addCookie(cookie);//将cookie 响应回客户端
    }

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

web.xml 文件配置servlet :

    <servlet>
        <servlet-name>CookieDemo01</servlet-name>
        <servlet-class>com.xu.cookie.CookieDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo01</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

运行结果:

cookie:一般会保存到本地的 用户目录下  appdata 

一个网站cookie 是否存在上限!

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,
  • cookie大小限制:4kb
  • 浏览器的上限:300个cookie

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效;
  • 设置有效期时间为 0 ;

删除Cookie代码实现:

package com.xu.cookie;

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;

public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建一个cookie , 名字必须要和要删除的名字一致
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");

        //将cookie有效期设置为 0 ,立马过期
        cookie.setMaxAge(0);

        //将cookie响应回客户端
        resp.addCookie(cookie);
    }

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

在web.xml 文件中配置servlet:

<!--    配置CookieDemo02-->
    <servlet>
        <servlet-name>CookieDemo02</servlet-name>
        <servlet-class>com.xu.cookie.CookieDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo02</servlet-name>
        <url-pattern>/c2</url-pattern>
    </servlet-mapping>

运行结果:

解决中文乱码问题:

        //编码中文
        URLEncoder.encode("小许","utf-8");
        //解码中文
        URLDecoder.decode(cookie.getValue(),"utf-8");

网站公告

今日签到

点亮在社区的每一天
去签到