cookie、session

Cookie、Session

1.会话

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

有状态会话:服务端给客户端一个信件, 客户端下次访问服务端的时候带上信件(Cookie);服务器登记你来过了, 下次你来的时候匹配你(Session)

2.保存会话的两种技术

Cookie

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

Session

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

常见场景:网站登录后第二次访问不再登录

3.Cookie

image

服务器先判断该请求得cookie是否存在,若不存在则创建一个cookie,用户在访问时带着cookie访问

1.从请求中拿到信息, 获得Cookie

Cookie []cookies = req.getCookie();

2.服务器响应给客户端cookie

cookie.getName()  //获得cookie中的key
cookie.getValue()  //获得cookie中的value
new Cookie("cookieName", "cookieValue")  //新建一个cookie,如System.currentTimeMillion + ""
cookie.setMaxAge(24 * 60 * 60)  //设置cookie的有效期为1天
resp.addCookie(cookie)  //在响应中添加cookie

3.cookie一般会保存在本地文件AppData中

4.一个网站的cookie是否存在上限

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

5.删除cookie

  • 不设置有效期,关闭浏览器自动失效
  • 设置有效期的时间为0
  • 创建一个新的同名的cookie,会自动覆盖原有的cookie

6.如果在给网页中文cookie出现乱码

可以使用网络编程中的编码、解码的过程

URLEncoder.encode("content", "utf-8");  //编码进行传送
URLDecoder.decode("content", "utf-8");  //再次使用时需要解码

7.记录上次访问时间代码

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


//保存用户上一次访问的时间
public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你你来的时间,然后把这个时间封装为一个信件,下次带着来
        resp.setContentType("utf-16");
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");

        PrintWriter out = resp.getWriter();
        //Cookie服务端从客户端获取, cookie可以存在多个
        Cookie[] cookies = req.getCookies();
        //判断cookie是否存在
        if(cookies != null){
            //如果存在
            out.println("上一次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie1 = cookies[i];
                //获取cookie的名字
                if(cookie1.getName().equals("LastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie1.getValue());
                    Date date = new Date(lastLoginTime);
                    out.println(date.toLocaleString());
                }
            }
        }else {
            out.print("这是第一次访问网站");
        }
        //服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
        //有效期为一天
        cookie.setMaxAge(24 * 60 * 60);
        resp.addCookie(cookie);
    }

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

4.Session

image

cookie是将数据直接通过cookie传回用户,而session则是通过SessionID在

1.什么是Session:

  • 服务器会给每个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器不关,Session一直有效
  • 用户登陆之后,所有子网页都可以访问

2.Session中常用的一些方法及使用:

image

//得到Session
HttpSession session = req.getSession();
//给Session中存东西,可以在不同网页上进行存和取
session.setAttribute("obj", new Person("ygw", 20));
//从Session中取东西,注意需要强转
Person person = (Person) session.getAttribute("obj");
//注销Session
session.removeAttribute("obj");
session.invalidate();
<!--在xml中注销Session的方法:会话自动过期-->
<!--设置session的失效时间-->
<session-config>
		<!--以分钟为单位,15分钟后session失效-->
        <session-timeout>15</session-timeout>
</session-config>

3.Session和Cookie的区别:

  • cookie是把用户的数据写给用户的浏览器保存
  • session把用户的数据写到用户独占的session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • session对象由服务器创建

4.使用场景:

  • 保存一个登陆用户的信息
  • 子网页的访问
  • 在整个项目中经常会使用的数据

5.一些参考代码:

package com.Gw.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class Session01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html; charset = utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给Session中存东西
        session.setAttribute("obj", new Person("ygw", 20));
        //获取session的id
        String id = session.getId();
        //判断session是不是新创建
        if(session.isNew()){
            resp.getWriter().write("session创建成功, id:" + id);
        }else{
            resp.getWriter().write("session已经在服务器中存在, id:" + id);
        }
        //Session创建的时候做了什么事情 -> 本质上像一个cookie
        //Cookie cookie = new Cookie("JSESSIONID", "408EEFF1B5172C9AC61584CFD41023EC");
        //resp.addCookie(cookie);

    }

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

//给session设置一个对象属性
package com.Gw.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class Session02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        HttpSession session = req.getSession();
        Person person = (Person) session.getAttribute("obj");
        System.out.println(person.toString());
    }

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


//注销session
package com.Gw.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class Session03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("obj");
        session.invalidate();
    }

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

posted @ 2022-03-17 22:29  CDUT的一只小菜鸡  阅读(22)  评论(0编辑  收藏  举报