JavaWeb之05_cookiesession

2024-06-11 02:08
文章标签 java web 05 cookiesession

本文主要是介绍JavaWeb之05_cookiesession,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

会话技术


明天又是充满希望的一天…

一、简介

1. 概念

  • 会话:一次会话中包含多次请求和响应
  • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
  • 会话功能:在一次会话的范围内的多次请求间,共享数据
  • 方式
    • 客户端会话技术:Cookie
    • 服务器端会话技术:Session

二、Cookie

1. 概念

  • 客户端会话技术,将数据保存到客户端

2. 入门

  • 1)使用步骤
    • 创建Cookie对象,绑定数据
      • new Cookie(String name, String value)
    • 发送Cookie对象
      • response.addCookie(Cookie cookie)
    • 获取Cookie,拿到数据
      • Cookie[] request.getCookies()

3. 原理

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

4. 详解

① 一次可以发送多个cookie吗?

  • 可以
  • 可以创建多个Cookie对象,使用response调用多次addCookie()即可

② cookie在浏览器保存多长时间

  • 1)默认:在浏览器关闭后,cookie数据被销毁
  • 2)持久化存储
    • setMaxAge(int seconds)
      • 正数:将cookie数据写到硬盘文件中。持久化存储。seconds:cookie存活时间
      • 负数:默认值
      • 零:删除cookie信息

③ cookie能不能存中文或特殊字符

  • tomcat8之前不能直接存储中文数据。
    • 需要将中文数据转码。一般采用URL编码
  • tomcat8之后,支持中文数据
  • tomcat不支持特殊字符,需要使用URL解码和编码

④ cookie共享问题

  • 1)假设在同一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
    • 默认,不能
    • 如何使之能共享?
      • setPath(String path):设置cookie的获取范围。默认,设置当前虚拟目录
      • setPath("/"):可以使当前服务器根目录下的所有项目都可以共享
  • 2)不同tomcat服务器之间如何共享?
    • setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享

5. 特点和作用

① 特点

  • 1)cookie存储数据在客户端浏览器(不安全)
  • 2)浏览器对于单个cookie的大小有限制(4kb),以及对同一个域名下的总cookie数量(20个)也有限制

② 作用

  • cookie一般用于存储少量的不太敏感的数据
  • 在不登录的情况下,完成服务器对客户端的身份识别

6. 案例

① 记录上一次访问时间

  • 1)需求

    • 访问一个servlet,如果第一次访问,则提示:您好,欢迎您首次访问。如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:xxx
  • 2)分析

    • 在服务器中的servlet判断是否有一个名为lastTime的cookie
      • 有:不是第一次访问
        • 响应数据
      • 没有:是第一次访问
        • 响应数据
        • 写回cookie
  • 3)代码

    • //0.设置响应消息体的content-type
      response.setContentType("text/html;charset=utf-8");//1.获取所有cookie
      Cookie[] cookies = request.getCookies();
      boolean flag = false; //没有cookie为false//2.遍历cookie
      if (cookies != null && cookies.length > 0) {for (Cookie cookie : cookies){//3.获取cookie的名称String name = cookie.getName();//4.查询是否存在lastTime的cookieif ("lastTime".equals(name)) {//有该cookie,不是第一次访问flag = true;//5.响应数据String value = cookie.getValue();//URL解码System.out.println("解码前:" + value);value = URLDecoder.decode(value, "utf-8");System.out.println("解码后:" + value);PrintWriter writer = response.getWriter();writer.write("<h1>" + "欢迎回来,您上次访问时间为:" + value + "</h1>");//6.设置cookie最新值,发送cookieSimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");String dateNow = sdf.format(new Date());//因为tomcat不支持cookie特殊字符,所以需要URL编码解码System.out.println("编码前:" + dateNow);dateNow = URLEncoder.encode(dateNow, "utf-8");System.out.println("编码后:" + dateNow);cookie.setValue(dateNow);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 12); //12hresponse.addCookie(cookie);break;}}
      }
      if (cookies == null || cookies.length == 0 || !flag) {//没有lastTime的cookie,第一次访问//获取当前时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");String dateNow = sdf.format(new Date());dateNow = URLEncoder.encode(dateNow, "utf-8");//创建cookie对象Cookie cookie = new Cookie("lastTime", dateNow);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 12); //12hresponse.addCookie(cookie);//响应数据PrintWriter writer = response.getWriter();writer.write("<h1>" + "您好,欢迎您首次访问." + "</h1>");
      }
      

二、Session

1. 概念

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

2. 入门

  • 1)获取HttpSession对象
    • HttpSession request.getSession();
  • 2)使用HttpSession对象
    • Object getAttribute(String name)
    • void setAttribute(String name, Object obj)
    • void removeAttribute(Sting name)

3. 原理

  • Session是依赖于Cookie的
  • 1)请求时,在第一次获取Session时,没有cookie,会在内存中创建一个新的session对象
  • 2)在响应时,服务器会设置响应头set-session:JSESSION=session对象的地址
  • 3)再次请求时,浏览器会带着cookei:JESSION=session对象的地址请求服务器,在服务器中获取session,根据该cookie获取session,是同一个session对象
  • 在这里插入图片描述

4. 详解

① 当客户端关闭后,服务端不关闭,两次获取session是否是同一个?

  • 1)默认情况不是

  • 2)可以通过设置cookie的值来持久化存储session

    • HttpSession session = request.getSession();
      Cookie cookie = new Cookie("JSESSION", session.getId());
      cookie.setMaxAge(60 * 60);
      

② 客户端不关闭,服务器关闭后,两次获取session时同一个吗?

  • 1)不是同一个
  • 2)在服务器关闭后,如何确保数据不丢失?
    • session的钝化:在服务器正常关闭之前,将session序列化到硬盘上
    • session的活化:在服务器开启后,将session文件转化到内存中的session对象
    • 注意:tomcat自动完成钝化和活化,idea的tamcat无法活化

③ session的失效时间?

  • 1)服务器关闭时session被销毁

  • 2)session调用invalidate()

  • 3)session默认失效时间:30分钟

    • 选择性配置修改,web.xml中

    • <session-config><session-timeout>30</session-timeout>
      </session-config>
      

5. 特点

① 特点

  • 1)session是用于存储一次会话的多次请求的数据,存储在服务器端
  • 2)session可以存储任意类型、任意大小数据

② session和cookie的区别

  • 1)session数据存储在服务器端,cookie存储在客户端
  • 2)session没有数据大小限制,cookie有
  • 3)session数据安全,cookie相对不安全

6. 案例

① 验证码

  • 1)需求

    • 访问带有验证码的登录页面login.jsp
    • 用户输入用户名,密码及验证码
      • 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
      • 如果验证码输入有误,跳转登录页面,提示:验证码错误
      • 如果全部输入正确,则跳转到主页seuccess.jps,显示:用户名,欢迎你
  • 2)分析

    • 在这里插入图片描述
  • 3)代码

  • 4)出现的小问题

    • ① 错误信息如何初始什么都不显示

      • <div><%= request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error") %></div>
        <div><%= request.getAttribute("login_error") == null ? "" :request.getAttribute("cc_error") %></div>
        
    • ② 点后退后,验证码重复使用(如何保证验证码的一次性?)

      • 在登录的servlet中,获取验证码后立即删除session的共享数据域

        • //先获取生产的验证码
          HttpSession session = request.getSession();
          String checkCode_session = (String)session.getAttribute("checkCode_session");
          //处理点击浏览器的后退后,验证码不刷新问题
          session.removeAttribute("checkCode_session");
          

  - ```java//先获取生产的验证码HttpSession session = request.getSession();String checkCode_session = (String)session.getAttribute("checkCode_session");//处理点击浏览器的后退后,验证码不刷新问题session.removeAttribute("checkCode_session");```

这篇关于JavaWeb之05_cookiesession的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049912

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt