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知识库 -> 【JavaWeb】Servlet的应用全面讲解(三)cookie和session -> 正文阅读

[Java知识库]【JavaWeb】Servlet的应用全面讲解(三)cookie和session

HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。

一、Cookie

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)

(一)cookie的创建和发送

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //cookie的创建
        Cookie cookie = new Cookie("name","admin");
        //发送(响应) Cookie对象
        resp.addCookie(cookie);
    }

(二)cookie的获取

将会返回一个cookie数组,供获取cookie数据

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookie数组
        Cookie[] cookies = req.getCookies();
        //判断cookie是否为空
        if(cookies != null && cookies.length>0){
            //遍历cookie数组
            for (Cookie cookie : cookies){
                //获取cookue的名称和值
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println("名称:"+name+" 值:"+value);
            }
        }
    }

(三)cookie的到期时间

1. 到期时间的表示

/**
 * cookie的到期时间
 *      负整数
 *          默认值-1,表示只在浏览器内存中存活,关闭浏览器失效
 *      正整数
 *          表示存活时间,单位秒
 *      零
 *          删除cookie
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*到期时间:负整数(默认值-1,表示只在浏览器内存中存活,关闭浏览器失效)*/

        Cookie cookie = new Cookie("uname1","zhangsan");
        cookie.setMaxAge(-1); //关闭浏览器失效
        resp.addCookie(cookie);

        /*到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)*/

        Cookie cookie2 = new Cookie("uname2","lisi");
        cookie.setMaxAge(30); //存活30s
        resp.addCookie(cookie2);

        /*到期时间:零 (表示删除cookie)*/

        Cookie cookie3 = new Cookie("uname3","wangwu");
        cookie.setMaxAge(0); //删除cookie
        resp.addCookie(cookie3);
    }

(四)cookie中文乱码问题、以及如何重新设置

1. 说明

/**
 * cookie的注意点
 *  1. Cookie只在当前浏览器有效(不跨浏览器和主机)
 *  2. Cookie不能存中文
 *      如果一定要存中文,则需要URLEncoder.encode()方法进行编码。获取时通过URLDecoder.decode()方法进行解码
 *
 *  3.如果出现同名的Cookie对象,则会覆盖
 *  4.Cookie的存储数量是有上限,不同浏览器不同。Cookie储存的大小也是有限的,大概4kb
 *
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*Cookie存中文*/
        String name = "姓名";
        String value = "张三";

        //将中文通过URLEncoder进行编码
        name = URLEncoder.encode(name);
        value = URLEncoder.encode(value);

        //创建Cookie对象
        Cookie cookie = new Cookie(name,value);
        //响应Cookie
        resp.addCookie(cookie);

        //获取Cookie时,通过URLDecoder进行解码
        Cookie[] cookies = req.getCookies();
        //判断非空
        if(cookies != null&& cookies.length>0){
            //遍历
            for(Cookie cook : cookies){
                //解码
                System.out.println(URLDecoder.decode(cook.getName()));
                System.out.println(URLDecoder.decode(cook.getValue()));
            }
        }

        //将原来已有的Cookie对象重新设置
        Cookie cookie2 = new Cookie("name","zhangsan");
        resp.addCookie(cookie2);

    }

(五)指定路径获取cookie

1. 说明

/**
 * cookie的路径
 *     1. 当前服务器下的任何项目的任意资源都可以获取Cookie对象
 *          设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
 *     2. 当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)
 *          默认不设置Cookie的path 或者 设置为当前站点名
 *     3. 指定项目下的资源都可以获取Cookie对象
 *     4. 指定目录下的资源都可以获取Cookie对象
 *
 *     总结:只有访问的路径中包含Cookie对象的Path值,才有以获取到该cookie对象
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*当前服务器下的任何项目的任意资源都可以获取Cookie对象*/
        Cookie cookie01 = new Cookie("cookie01","cookie01");
        //设置路径为“/”,表示在当前服务器下任何项目都可访问到Cookie对象
        cookie01.setPath("/");
        resp.addCookie(cookie01);

        /*当前项目下的资源都可以获取Cookie对象 (默认不设置Cookie的path)*/
        Cookie cookie02 = new Cookie("cookie02","cookie02");
        //默认不设置Cookie的path 或者 设置为当前站点名
        cookie01.setPath("/servlet");
        resp.addCookie(cookie02);

        /*指定项目下的资源都可以获取Cookie对象 */
        Cookie cookie03 = new Cookie("cookie03","cookie03");
        //设置为指定项目的站点名
        cookie01.setPath("/指定站点名");
        resp.addCookie(cookie03);

        /*指定目录下的资源都可以获取Cookie对象 */
        Cookie cookie04 = new Cookie("cookie04","cookie04");
        //设置为指定项目的站点名
        cookie01.setPath("/servlet/cookie04");
        resp.addCookie(cookie04);
    }

二、Session

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。

(一)session对象的获取和访问

1. 说明

/**
 * Session对象的获取
 *  session对象的获取
 *      req.getSession()
 *      当获取session对象时,会先判断session对象是否存在。若存在,则获取,反之,则创建。
 *  常用方法
 *      获取session的会话标识符     getId()
 *      获取session的创建时间       getCreationTime()
 *      获取最后一次访问时间         getLastAccessedTime()
 *      判断是否是新的session对象   isNew()
 */

2.代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //获取session的会话标识符
        String id = session.getId();
        System.out.println(id);
        //获取session的创建时间
        System.out.println(session.getCreationTime());
        //获取最后一次访问时间
        System.out.println(session.getLastAccessedTime());
        //判断是否是新的session对象
        System.out.println(session.isNew());

    }

(二)session域对象的应用

1. 说明

/**
 * Session域对象
 *      setAttribute() 设置域对象
 *      getAttribute() 获取域对象
 *      removeAttribute() 移除域对象
 *
 *      请求转发
 *          一次请求
 *          request作用域有效
 *          session作用域有效
 *      重定向
 *      ·   两次请求
 *          request作用域无效
 *          session作用域有效
 */

2. 代码演示

重定向时,session域依旧能够共享

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //设置域对象
        session.setAttribute("uname", "admin");
        session.setAttribute("upwd", "123456");

        //移除session域对象
        session.removeAttribute("upwd");

        /*request域对象*/
        req.setAttribute("name","zhangsan");

        //请求转发跳转到jsp页面
        //req.getRequestDispatcher("sessionTest.jsp").forward(req,resp);
        //重定向跳转到jsp页面
        resp.sendRedirect("sessionTest.jsp");

    }

jsp页面获取session域对象

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取域对象</title>
</head>
<body>
<%
  //获取session域对象
  String uname = (String) request.getSession().getAttribute("uname");
  String upwd = (String) request.getSession().getAttribute("upwd");

  //获取request域对象
  String name = (String) request.getAttribute("name");

  out.print("uname :"+ uname + ",upwd :"+ upwd +",name :" +name);
%>
</body>
</html>

session对象的过期和销毁

1. 说明

/**
 * Session对象的销毁
 *      1. 默认到期时间
 *          Tomcat 中的session默认存活时间为30min,即你无操作的时间。一旦有操作,session存活时间将重计
 *          可以在 Tomcat 中的 conf 目录下的 web.xml 文件中进行修改
 *
 *          <!-- session 默认的最大不存活时间。单位:分钟 -->
 *          <session-config>
 *              <session-timeout>30</session-timeout>
 *          </session-config>
 *
 *      2. 手动设置到期时间
 *          通过session.setMaxInactiveInterval(int)来设定session的最大不活动时间,单位为秒
 *          并且可以通过getMaxInactiveInterval()方法来查看当前Session对象的最大不活动时间
 *
 *      3. 立即销毁
 *          通过session.invalidate()方法
 *
 *      4.关闭浏览器
 *          session底层依赖cookie,cookie对象默认只在浏览器内存中存活,关闭浏览器即失效
 *
 *      5.关闭服务器
 *          关闭服务器,session销毁
 */

2. 代码演示

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();

        //设置域对象
        session.setAttribute("uname", "admin");

        /*//Session 对象的最大不活动时间
        System.out.println("当前Session对象的最大不活动时间:"+session.getMaxInactiveInterval());

        //修改Session 对象的最大不活动时间为15秒
        session.setMaxInactiveInterval(15);*/

        //立即销毁
        session.invalidate();
    }

End

简单理解cookie和session和cookie就是一个字典,只是一个储存在服务器、一个存储在客户端。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:18:55  更:2022-03-15 22:19:44 
 
开发: 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:21:07-

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