Cookie&Session

Posted 超霸霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie&Session相关的知识,希望对你有一定的参考价值。

Cookie&Session

一、会话技术

  • 会话:一次会话中包含多次请求和响应
  • 功能:在一次会话的范围内的多次请求间共享数据
  • 方式
    • 客户端会话技术:Cookie
    • 服务器端会话技术:Session

二、Cookie

1.概念

客户端会话技术,绑定数据

2.使用步骤

  1. 创建Cookie对象,绑定数据
  2. 发送Cookie对象
  3. 获取Cookie,拿到数据
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie c = new Cookie("msg", "hello");
        //2.发送cookie
        response.addCookie(c);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //3.获取Cookie
        Cookie[] cs = request.getCookies();
        //获取数据,遍历Cookies
        if (cs != null) {
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name + "---" + value);
            }
        }
    }
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

3.实现原理

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

4.Cookie的细节

  • 一次性发送多个cookie:使用response调用多次addCookie方法发送cookie即可

    Cookie c1 = new Cookie("msg", "hello");
    Cookie c2 = new Cookie("name", "luffy");
    response.addCookie(c1);
    response.addCookie(c2);
    
  • cookie在浏览器中的保存时长:

    1. 默认情况下,浏览器关闭后cookie数据被销毁
    2. 持久化存储:setMaxAge(int Seconds)
      • 正数:将Cookie数据写到硬盘的文件中,在该时间内,关闭浏览器,cookie信息仍保留
      • 负数:默认值
      • 0:删除Cookie信息
    Cookie c = new Cookie("msg", "hello");
    c.setMaxAge(50);
    response.addCookie(c);
    
  • cookie存中文问题:

    • tomcat 8之后,cookie支持中文数据
    • 特殊字符(空格)不支持,需要使用URL编码,URL解码
    URLEncoder.encode(str, "utf-8");//URL编码
    URLDecoder.decode(str, "utf-8");//URL解码
    
  • cookie共享问题:

    1. 同一个服务器中:
      • 在同一个tomcat服务器中,部署了多个web项目,不是同一个目录下的servlet之间的cookie不能共享(设置Appliaction context为目录)
      • setPath(String path):设置cookie的获取范围,一般设置为/达到共享目的
    c.setPath("/");
    
    1. 不同服务器之间:
      • setDomain(String path):如果设置一级域名相同,则多个服务器之间cookie可以共享

5.Cookie的特点和作用

  • cookie存储数据在客户端浏览器
  • 浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
  • cookie一般用于存储少量不太重要的数据
  • 注意作用:在不登陆的情况下,完成服务器对客户端的身份识别

6.Cookie案例

  • 第一次登录时打印第一次登录,否则打印上一次登录时间
package cn.chao.web;

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;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/Cookie_example")
public class Cookie_example extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这里必须设置才能显示中文
        response.setContentType("text/html;charset=utf-8");
        //1.获取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;
        //2.遍历所有Cookie
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                //3.判断Cookie名称是否等于lastTime
                if ("lastTime".equals(cookie.getName())) {
                    flag = true;
                    //不是第一次登录
                    String lasttime = cookie.getValue();//上一次登录时间
                    lasttime = URLDecoder.decode(lasttime, "utf-8");//URL解码
                    response.getWriter().write("<h1>上一次的登录时间为:" + lasttime + "</h1>");

                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
                    String nowtime = sdf.format(date);
                    nowtime = URLEncoder.encode(nowtime, "utf-8");//URL编码
                    cookie.setValue(nowtime);
                    response.addCookie(cookie);//必须发送回去
                }
            }
        }
        if (cookies == null || flag == false) {
            //第一次登录
            response.getWriter().write("<h1>第一次登录</h1>");
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日hh:mm:ss");
            String nowtime = sdf.format(date);
            nowtime = URLEncoder.encode(nowtime, "utf-8");
            Cookie cookie = new Cookie("lastTime", nowtime);
            cookie.setMaxAge(60 * 60 * 24 * 30);//设置周期为一个月
            response.addCookie(cookie);
        }
    }

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

三、Session

1.概念

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中:HttpSession

2.HttpSession

  • 获取HttpSession对象:

    HttpSession session=request.getSession();
    
  • 使用HttpSession对象:

    1. Object getAttribute(String name);
      
    2. void setAttribute(String name,Object value);
      
    3. void removeAttribute(String name);
      
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello");

//1.获取session
HttpSession session = request.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);

3.原理

Session的实现是依赖于Cookie的

4.细节

  • 客户端关闭,服务器不关闭,两次获取的session是否为同一个

    • 默认情况下不是同一个
    • 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
    //2.期望客户端关闭后,session也能相同
    Cookie c = new Cookie("JSESSIONID", session.getId());
    c.setMaxAge(60 * 60);
    response.addCookie(c);
    
  • 客户端不关闭,服务器关闭后,两次获取的session是否为同一个

    • 不是同一个,但是要确保数据不丢失,tomcat自动完成以下工作
      1. session的钝化:在服务器正常关闭前,将session对象系列化到硬盘上
      2. session的活化:在服务器启动后,将session文件转化为内存中的session对象
  • session什么时候被销毁

    • 服务器关闭
    • session对象调用invalidate()方法
    • session默认失效时间为30分钟
    //选择性修改配置
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    

5.Session的特点

  • session用于存储一次会话的多次请求的数据,存在于服务器端
  • session可以存储任意类型,任意大小的数据
  • session与cookie的区别:
    1. session存储数据在服务器端,cookie在客户端
    2. session没有数据大小限制,cookie有
    3. session数据安全,cookie相对不安全

以上是关于Cookie&Session的主要内容,如果未能解决你的问题,请参考以下文章

Cookie&Session

会话技术:Cookie && Session

jsp&cookie&session-01

Session&&cookie

Cookie&Session

Cookie&Session