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 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 四、Cookie、Session -> 正文阅读

[系统运维]四、Cookie、Session

四、Cookie、Session

1、Cookie:客户端会话技术(小饼干)
  1. 使用步骤:

    1. 创建Cookie对象,绑定数据 : new Cookie(String,String)
    2. 发送Cookie对象,通过response传递给浏览器 :response.addCookie(Cookie cookie)
    3. 获取Cookie拿到数据,通过下一次的请求 :Cookie[] request.getCookies()
  2. 实现原理:

    1. 添加一个Cookie进入response响应体时,会有响应头set-Cookie以键值对的形式发送给浏览器

    2. 当浏览器再发送一次请求的时,会有请求头Cookie以键值对的形式发送给服务器

    3. 基于响应头Set-Cookie和请求头Cookie实现

      cookie

  3. 关于Cookie的一些细节点:

    1. 一次可不可以发送多个Cookie?

      • 可以,可以创建多个Cookie对象,使用response调用多次addCookie发送cookie即可
    2. Cookie在浏览器中保存多长时间?

      • 默认情况下,当浏览器关闭时,Cookie数据就被清除
      • 持久化存储:setMaxAge(int seconds)
        1. 参数为整数:将Cookie数据写到硬盘中,持久化存储,并指定Cookie的存活时间
        2. 参数为负数:默认值(即浏览器关闭,Cookie自动清除)
        3. 参数为零:删除Cookie的信息
    3. Cookie能不能存储中文?

      • Tomcat 8 之前 :Cookie不能存储中文,需要使用中文数据转码——URL编码
      • Tomcat 8 之后 :支持中文数据,但是还是不吃特殊字符,还是要使用URL编码,URL解码
        • URL编码 :String URLEncode(String str,String enc)
        • URL解码 :String URLDecode(String str,String enc)
    4. Cookie的共享问题?

      1. 一个Tomcat服务器中部署了多个web项目,这些web项目能不能共享?

        1. 默认情况下,Cookie不能共享
        2. setPath(String path):设置Cookie的获取范围,默认情况下,设置当前的虚拟目录
          • 如果要共享,则可以将path设置为 “/”
      2. 不同的Tomcat服务器之间Cookie如何共享?

        • setDomain(String path):如果一级域名相同,那么多个服务器之间Cookie可以共享

          setDomain(".baidu.com"),那么tieba.baidu.com 和 news.baidu.com中的数据可以共享

  4. Cookie的特点以及作用:

    1. 特点:
      • Cookie存储数据在客户端浏览器
      • 浏览器对于单个Cookie的大小由限制(4kb)以及对同一个域名下的总Cookie数量有限制(20个)
    2. 作用:
      • Cookie一般用于存储少量不太敏感的数据
      • 在不登录的情况下,完成服务器对客户端的身份认证
2、使用Cookie会话技术完成记住上一次访问时间案例
  • 需求:

    1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问
    2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
  •     @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置响应编码
            resp.setContentType("text/html;charset=utf-8");
            //1.获取所有的Cookie
            Cookie[] cookies = req.getCookies();
            boolean flag = true;
            if (cookies != null && cookies.length > 0){//说明Cookie不为空
                for (Cookie cookie : cookies) {
                    //获取Cookie名为lastTime的Cookie
                    String name = cookie.getName();
                    if ("lastTime".equals(name)){//2.含有lastTime的Cookie说明不是第一次访问
                        flag = false;//用来标记找到了
                        //访问过后,上一次访问时间应该修改为此次时间
                        Date date = new Date();
                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
                        String format = dateFormat.format(date);
                        //使用URL编码
                        format = URLEncoder.encode(format, "UTF-8");
                        cookie.setValue(format);//将值存放在lastTimeCookie中
                        resp.addCookie(cookie);//将Cookie放在响应体中
                        String value = cookie.getValue();//获取value值
                        //需要使用URL解码,转换为原来的字符串
                        value = URLDecoder.decode(value, "UTF-8");
                        //将value值通过response到页面上
                        resp.getWriter().write("<h1>欢迎回来,您上次的访问时间为:" + value + "</h1>");
                        break;//找到了跳出循环,没有必要循环下去
                    }
                }
            }
            if (cookies == null || cookies.length < 0 || flag){//说明是第一次访问
                LocalDateTime time = LocalDateTime.now();
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss");
                String timeValue = formatter.format(time);
                //Cookie中不能存储特殊字符(空格就是),需要使用URL编码
                timeValue = URLEncoder.encode(timeValue, "UTF-8");
                Cookie cookie = new Cookie("lastTime", timeValue);
                //设置Cookie的存活时间为一个月
                cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                resp.addCookie(cookie);
                resp.getWriter().write("<h1>你好欢迎您首次访问</h1>");
            }
        }
    
3、Session:服务器会话技术(主菜)
  1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中HttpSession

  2. 使用HTTPSession对象:

    1. 获取HttpSession对象:HttpSession session = request.getSession();
    2. 使用HttpSession对象:
      1. Object getAttribute(String name)
      2. void setAttribute(String name,Object value)
      3. void removeAttribute(String name)
  3. Session原理:Session的实现是基于Cookie的

    session

  4. 关于Session使用的一些细节:

    1. 当客户端浏览器关闭后,服务器不关闭,两次获取Session是否为同一个?

      • 默认情况下,不是同一个

      • 如果需要相同,可以创建Cookie,键为JSESSIONID,设置最大存活时间,让Cookie持久化保存

        	Cookie cookie = new Cookie("JSESSIONID", session.getId());
            cookie.setMaxAge(60 * 60);
            resp.addCookie(cookie);
        
    2. 客户端不关闭,服务器关闭后,两次获取Session是否是同一个?

      • 不是同一个,但是要确保数据不丢失,Tomcat已完成一下工作
        1. Session的钝化(序列化):在服务器正常关闭之前,将Session对象序列化到硬盘上
        2. Session的活化(反序列化):在服务器启动后,将Session文件转换为内存中的Session对象即可
    3. Session怎么被销毁?

      1. 服务器关闭Session会被销毁

      2. Session调用invalidate()方法,会将当前Session对象销毁

      3. Session默认失效时间为 30分钟,可以进行配置

        <session-config>
        	<session-timeout>30</session-timeout>
        </session-config>
        
    4. Session的特点:

      1. Session用户存储一次会话多次请求的数据,存在服务器端
      2. Session可以存储任意类型数据,任意大小
4、Session和Cookie的区别:
  1. Session存储数据在服务器端,Cookie在客户端
  2. Session存储数据没有大小和类型的限制,Cookie有
  3. Session数据安全,Cookie相对不安全
5、使用Session实现验证码登录案例

ession可以存储任意类型数据,任意大小

4、Session和Cookie的区别:
  1. Session存储数据在服务器端,Cookie在客户端
  2. Session存储数据没有大小和类型的限制,Cookie有
  3. Session数据安全,Cookie相对不安全
5、使用Session实现验证码登录案例
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:21:07  更:2021-09-19 08:23:06 
 
开发: 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/15 16:52:49-

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