Servlet技术之Cookie对象与HttpSession对象

2023-12-26 13:28

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

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Servlet技术之Cookie对象与HttpSession对象


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、Cookie对象与HttpSession对象的介绍
    • Cookie介绍
    • Cookie对象的特点
    • HttpSession介绍
    • HttpSession对象的特点
  • 二、对象的使用
    • Cookie对象的使用
      • Cookie对象的创建
      • 获取Cookie的数据
      • 状态Cookie和持久化Cookie
      • 解决Cookie中文乱码
    • HttpSession对象的使用
      • HttpSession对象的创建
      • HttpSession对象的使用
      • HttpSession对象的销毁方式
        • 默认时间到期
        • 手动销毁
      • HttpSession生命周期
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在博客应用程序中,用户的登录状态、偏好设置等信息需要在多个页面之间进行传递和共享。在 Servlet 技术中,我们可以使用 Cookie 对象和 HttpSession 对象来实现这一目标。
Cookie 对象是一种在客户端存储少量数据的机制,它将数据以键值对的形式存储在用户的浏览器中。通过设置和获取 Cookie 对象,我们可以在客户端和服务器之间传递一些简单的状态信息。
而 HttpSession 对象则是一种在服务器端存储用户会话信息的机制,它将用户的会话信息存储在服务器的内存中,并为每个用户创建一个唯一的会话标识。通过 HttpSession 对象,我们可以在多个页面之间共享用户的会话信息,例如登录状态、购物车信息等。
在博客应用程序中,我们可以使用 Cookie 对象来存储用户的登录状态,以便在用户下次访问时自动登录。同时,我们也可以使用 HttpSession 对象来存储用户的偏好设置、博客文章等信息,以便在多个页面之间进行共享。
在接下来的博客中,我们将深入探讨 Cookie 对象和 HttpSession 对象的使用方法、注意事项以及在博客应用程序中的实际应用。希望这些内容能够帮助你更好地理解和应用 Servlet 技术,开发出更加优秀的博客应用程序。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Cookie对象与HttpSession对象的介绍

Cookie对象和HttpSession对象都是用于在 Web 应用程序中存储和管理状态信息的机制。

Cookie介绍

Cookie对象是一种在客户端存储少量数据的机制,它将数据以键值对的形式存储在用户的浏览器中。Cookie通常用于存储用户的登录状态、偏好设置等信息,以便在后续的请求中进行传递和使用。
Cookie对象具有以下几个重要属性和方法:

  • name:Cookie的名称,用于标识Cookie。
  • value:Cookie的值,可以是任意类型的数据。
  • domain:Cookie的作用域,可以指定为当前域名或子域名。
  • path:Cookie的路径,默认为当前路径。
  • expiry:Cookie的过期时间,默认为浏览器关闭时失效。

通过设置Cookie对象的这些属性,可以将Cookie添加到响应中,并在后续的请求中通过请求对象获取到相应的Cookie值。

Cookie对象的特点

  • 存储在客户端:Cookie 是由服务器发送给客户端的一小段文本数据,通常包含一些关于用户或会话的信息。客户端(通常是浏览器)会将 Cookie 存储在本地,以便在后续的请求中携带给服务器。
  • 键值对的形式:Cookie 以键值对的形式存储数据,其中键(Cookie 的名称)和值(Cookie 的内容)都是字符串。
  • 持久性:Cookie 可以设置过期时间,过期时间决定了 Cookie 在客户端的存活时间。如果没有设置过期时间,Cookie 将在浏览器关闭时失效。过期时间可以是特定的日期和时间,也可以是相对时间(例如几天后过期)。
  • 储存大小:单个Cookie存储数据大小限制在4097个字节
  • 跨域限制:默认情况下,浏览器不允许一个域的脚本访问其他域设置的 Cookie。这是为了防止跨站脚本攻击(CSRF)等安全问题。但是,可以通过一些配置(如 CORS)来允许跨域访问。
  • 保存地址:Cookie对象保存在客户端浏览器内存或系统磁盘中
  • Cookie分为持久化Cooke与状态Cookie

HttpSession介绍

HttpSession对象是一种在服务器端存储用户会话信息的机制,它将用户的会话信息存储在服务器的内存中,并为每个用户创建一个唯一的会话标识。HttpSession通常用于存储用户的登录状态、购物车信息等,以便在多个页面之间共享和使用。
HttpSession对象具有以下几个重要方法和属性:

  • getId():获取当前会话的唯一标识。
  • setAttribute(String name, Object value):将对象存储在当前会话中,并指定一个键来检索它。
  • getAttribute(String name):获取存储在当前会话中的对象,通过指定的键来检索它。
  • removeAttribute(String name):从当前会话中移除指定键对应的对象。

需要注意的是,Cookie是存储在客户端浏览器中的,因此存在一定的安全性风险。为了保护用户的隐私和安全,应尽量避免在Cookie中存储敏感信息,并设置适当的过期时间。而HttpSession是存储在服务器端的,相对来说更加安全,但也需要注意会话的超时时间和管理。

HttpSession对象的特点

  • 服务器端存储:HttpSession是在服务器端存储的对象,与特定的用户会话相关联。服务器会为每个用户创建一个独立的HttpSession对象,并在用户的会话期间维护该对象。
  • 会话标识符:HttpSession通过一个唯一的会话标识符(Session ID)来标识每个用户的会话。当客户端发送请求时,会将这个会话标识符传递给服务器,服务器通过它来找到对应的HttpSession对象。
  • 生命周期:HttpSession的生命周期与用户的会话相关联。通常情况下,一个会话在用户关闭浏览器或经过一段时间的不活动后会超时。超时时间可以通过服务器端的配置来设置。
  • HttpSession存储数据大小无限制
  • 跨页面共享:存储在HttpSession中的数据可以在同一用户的多个页面之间共享。只要这些页面属于同一个会话,它们都可以通过HttpSession对象来访问和修改共享的数据。

二、对象的使用

Cookie对象的使用

Cookie对象的创建

Cookie cookie = new Cookie("key","value");
//通过new关键字创建Cookie对象
response.addCookie(cookie)
//通过HttpServletResponse对象将Cookie写回给客户端浏览器。

获取Cookie的数据

浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。通过HttpServletRequest对象获取Cookie,返回Cookie数组。

Cookie[] cookies = request.getCookies();

状态Cookie和持久化Cookie

  • 状态Cookie:Cookie对象仅会被缓存在浏览器所在的内存中。当浏览器关闭后Cookie对象 也会被销毁。
  • 持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

状态Cookie仅会被缓存在浏览器所在的内存中,当浏览器关闭后Cookie对象也会被销毁。要将状态Cookie变为持久化Cookie,可以使用Cookie.setMaxAge()方法设置失效时间,单位为秒,一旦设置了失效时间,那么该Cookie就会被浏览器持久化到磁盘中,当失效时间到达后文件会被删除。
需要注意的是,设置Cookie的失效时间需要谨慎,因为这可能会导致用户的隐私信息被泄露。如果你有这方面的需求,建议咨询专业的安全机构或法律专业人士。

解决Cookie中文乱码

URLEncoder.encode(“content”,“code”),将内容按照指定的编码方式做URL编码处理。如:

Cookie cookie = new Cookie("key",URLEncoder.encode("value","utf-8"));

URLDecoder.decode(“content”,“code”),将内容按照指定的编码方式做URL解码处理。如:

URLDecoder.decode("编码后的字符串", "UTF-8"); // 解码

HttpSession对象的使用

HttpSession对象的创建

HttpSession对象的创建过程通常由 Web 容器(如 Tomcat、Jetty 等)负责。当客户端首次发送请求到服务器时,服务器会检查请求中是否包含会话标识符(Session ID)。如果请求中没有会话标识符,服务器会生成一个唯一的会话标识符,并将其作为响应的一部分返回给客户端。客户端会将这个会话标识符保存在浏览器中,以后的请求都会携带这个会话标识符。
当服务器接收到带有会话标识符的请求时,它会根据会话标识符查找对应的HttpSession对象。如果找到了对应的HttpSession对象,服务器会将该请求与该会话关联起来,并可以通过HttpSession对象来访问和修改存储在会话中的数据。如果找不到对应的HttpSession对象,服务器会创建一个新的HttpSession对象,并将其与当前请求关联起来。
下面是一个简单的 Java 代码示例,演示了如何在服务器端获取HttpSession对象:

import javax.servlet.http.HttpSession;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/sessionExample")
public class SessionExampleServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取 HttpSession 对象HttpSession session = request.getSession();// 可以通过 HttpSession 对象访问和修改会话数据String username = (String) session.getAttribute("username");if (username == null) {username = "匿名用户";}response.getWriter().println("欢迎," + username);}
}

注意:getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据jsessionid查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有jsessionid则不会创建新的HttpSession对象。

HttpSession对象的使用

session.setAttribute("key",value);
//将数据存储到HttpSession对象中
Object value = session.getAttribute("key");
//根据key获取HttpSession中的数据,返回Object
Enumeration attributeNames = session.getAttributeNames();
//获取HttpSession中所有的key,返回枚举类型
session.removeAttribute("key");
//根据key删除HttpSession中的数据
String id = session.getId();
//根据获取当前HttpSession的SessionID,返回字符串类型

HttpSession对象的销毁方式

默认时间到期

服务器会为每个HttpSession对象设置一个默认的过期时间,一旦超过这个时间,服务器就会自动销毁该对象。我们可以在web.xml中设置超时时间,单位为分钟

<session-config><session-timeout>1</session-timeout>
</session-config>
手动销毁

直接调用HttpSession对象的invalidate()方法,可以使HttpSession立即失效

HttpSession生命周期

HttpSession生命周期中没有固定的创建和销毁时间。当我们第一次调用getSession()或者getSession(true)的时候,这是HttpSession便创建了;当会话超时或者调用了invalidate()方法,则会话销毁。

总结

提示:这里对文章进行总结:

总之,在选择使用Cookie还是HttpSession时,需要考虑数据的安全性、存储大小、有效期等因素。对于不敏感的、较小的数据,可以选择使用Cookie;对于敏感的、较大的数据,或者需要在多个页面之间共享的数据,可以选择使用HttpSession。

这篇关于Servlet技术之Cookie对象与HttpSession对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的