IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> javaee之cookie与session -> 正文阅读

[Java知识库]javaee之cookie与session

都是用来存放数据的,一个放在服务器端session会话,一个放在客户端cookie会话

实质:在一次会话中(服务器与浏览器之间一直在进行请求与响应),共享数据

cookie从服务器设置对象,然后存放到客户端,那么我从好几个页面设置的cookie,然后只要服务器获取到这些页面的资源(访问),cookie对象就会存在,同时在客户端我们就可以通过getCookies函数来进行获取,从而来判断一些信息。

至于cookie的消失,第一个是关闭浏览器就消失,但是如果我们给某个cookie的存活时间设置的特别长,那么也不会马上就消失。

现在来说一下cookie的实现原理:

先来看一个页面

CookServlet1

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("/CookieServlet1")
public class CookieServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie c1 = new Cookie("msg","hello");
        response.addCookie(c1);
    }

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

然后去访问一下页面,看一下请求头与响应头

?

上面很明显可以看到,响应头给我们Set-Cookie了,然后请求头获取Cookie实现了这些cookei信息?,并把数据放到浏览器端

另外再说一点,Cookie一般只能在服务器下面的一个web项目会话中进行数据的交互,但是,你想要不同服务器下面,共享cookie,就用setPath("/")

甚至想在不同服务器之间共享cookie,用setDomain(".baidu.com"),那么一级域名相同的服务器就可以进行cookie共享

在来说一下session:

好,这样来说一下它的生存时间

这里在来说一点,session对象是依赖于Cookie存在的,为什么?

当我们去访问一个web资源,这个资源给我们实现了session,也就是说给我们设置了session对象,同时会给我们创建一个cookie信息,名字叫SESSIONID。每次去访问session对象都会带着这个sessionid去寻找,因此在同一个会话中就是同一个session对象,因为他们sessionid都一样。

现在有一个问题:当客户端关闭,会话是否结束?

我觉得,客户端关闭,不能完全说会话结束,如果设置了cookie的保存时间,那么cookie不会马上消失,同时session也没有被销毁,所以,两个cookie与session会话都存在。

当cookie的时间到了,cookie消失,cookie会话关闭,session时间到了或者主动被销毁了,session会话关闭。

单独来说一个会话:浏览器第一次给服务器发送请求,会话建立,直到有一方断开,会话结束。那么如果这样来说,浏览器关闭,此时会话结束。

那么现在又抛出一个问题:当浏览器关闭之后,再次访问session对象,是不是统一个session对象?

按照常理来说,不是,因为你浏览器每次重新打开,然后重新访问资源,都会生成一个新的session对象,然后生成一个新的sessionid标识,用于浏览器在这次会话中,寻找session对象。

上面说了session是依赖于cookie存在的,那么我们如果自己设置一个sessionid,然后让它保存的时间尽可能长一点,那么浏览器下次在打开,就会去根据这个sessionid去寻找这个session对象,从而你不管打开几次浏览器,拿到的都是同一个session对象,只要sessionid的时间够长。这个也可以这样理解,只要sessionid存在,我们获取的session 永远是同一个对象。

话不多说,直接上代码

Session1

package session;

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

@WebServlet("/session1")
public class Session1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession hs = request.getSession();
        hs.setAttribute("name","tom");
        hs.setAttribute("password","5201314");
        //同时指定一个cookie信息
        Cookie cookie1 = new Cookie("JSESSIONID",hs.getId());
        //设置一下Cookie时间
        cookie1.setMaxAge(60*60);
        response.addCookie(cookie1);
}

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

SessionGet

package session;

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

@WebServlet("/sessionGet")
public class SessionGet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object value1 = session.getAttribute("name");
        Object value2 = session.getAttribute("password");
        System.out.println("name:" + value1 + "password:" + value2);
        System.out.println(session);
    }

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

第一个文件,我是来得到一个session对象,并且拿到了它的sessionid,然后把它做成了一个cookie,并且设置了消亡时间是3600秒,然后我访问了一下,然后关闭浏览器,又重新访问了一下,打印结果

很明显这样子,两次访问一个session ,都是同一个session对象。

下面直接上代码,记录上一次登录时间

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    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;//没有cookie为lastTime
        //2.遍历cookie数组
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                //3.获取cookie的名称
                String name = cookie.getName();
                //4.判断名称是否是:lastTime
                if("lastTime".equals(name)){
                    //有该Cookie,不是第一次访问

                    flag = true;//有lastTime的cookie

                    //设置Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
                    Date date  = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    //对于中文要重新编码
                    System.out.println("编码前:"+str_date);
                    //URL编码
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("编码后:"+str_date);
                    //把这个lastTime的cookie设置为当前时间
                    cookie.setValue(str_date);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                    //添加到浏览器
                    response.addCookie(cookie);

                    //响应数据
                    //获取Cookie的value,时间
                    String value = cookie.getValue();
                    System.out.println("解码前:"+value);
                    //URL解码:
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println("解码后:"+value);
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");


                    break;

                }
            }
        }


        if(cookies == null || cookies.length == 0 || flag == false){
            //没有,第一次访问

            //设置Cookie的value
            //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
            Date date  = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = sdf.format(date);
            System.out.println("编码前:"+str_date);
            //URL编码
            str_date = URLEncoder.encode(str_date,"utf-8");
            System.out.println("编码后:"+str_date);

            Cookie cookie = new Cookie("lastTime",str_date);
            //设置cookie的存活时间
            cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
            response.addCookie(cookie);
            //向客户端回写数据,第一次访问
            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }


    }

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

?好了说到这

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 21:56:42  更:2022-03-17 22:01:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:42:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码