[Java开发之路](26)Cookie机制

简介: 1. Cookie机制会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。
1. Cookie机制

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

2. 设置Cookie的所有属性

除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表5.1所示。



下面是一个使用所有参数设置Cookie的一个例子。源代码如下:

 
  
  1. <%@ page language="java" pageEncoding="UTF-8" %>
  2. <jsp:directive.page import="java.net.URLEncoder"/>
  3. <%!
  4. boolean isNull(String str){ // 返回字符串是否为空
  5. return str==null || str.trim().length()==0;
  6. }
  7. %>
  8. <%
  9. request.setCharacterEncoding("UTF-8");
  10. // 设置request编码
  11. if("POST".equals(request.getMethod())){ //
  12. 如果是POST提交数据
  13. String name = request.getParameter("name");
  14. // 获取name参数
  15. String value = request.getParameter("value");
  16. // 获取value参数
  17. String maxAge = request.getParameter("maxAge");
  18. // 获取maxAge参数
  19. String domain = request.getParameter("domain");
  20. // 获取domain参数
  21. String path = request.getParameter("path");
  22. // 获取path参数
  23. String comment = request.getParameter("comment");
  24. // 获取comment参数
  25. String secure = request.getParameter("secure");
  26. // 获取secure参数
  27. if(!isNull(name)){
  28. // 如果name参数不为空
  29. Cookie cookie = new Cookie(
  30. // 则生成新的Cookie
  31. URLEncoder.encode(name, "UTF-8"),
  32. URLEncoder.encode(value, "UTF-8"));
  33. // 若maxAge非空则设置maxAge属性
  34. if(!isNull(maxAge)) cookie.setMaxAge(Integer.
  35. parseInt(maxAge));
  36. if(!isNull(domain)) cookie.setDomain(domain);
  37. //
  38. domain非空则设置domain
  39. if(!isNull(path)) cookie.setPath(path);
  40. //
  41. path非空则设置path
  42. if(!isNull(comment)) cookie.setComment(comment);
  43. //
  44. 设置comment
  45. if(!isNull(secure)) cookie.setSecure
  46. ("true".equalsIgnoreCase(secure));
  47. response.addCookie(cookie); // 覆盖旧的Cookie
  48. }
  49. }
  50. %>
  51. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  52. <html>
  53. <head>
  54. <title>Cookie</title>
  55. <meta http-equiv="pragma" content="no-cache">
  56. <meta http-equiv="cache-control" content="no-cache">
  57. <meta http-equiv="expires" content="0">
  58. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  59. <meta http-equiv="description" content="This is my page">
  60. <link rel="stylesheet" type="text/css" href="css/style.css">
  61. </head>
  62. <body>
  63. <div align="center" style="margin:10px; ">
  64. <fieldset>
  65. <legend>当前有效的 Cookie</legend>
  66. <script type="text/javascript">
  67. document.write(document.cookie);
  68. </script>
  69. </fieldset>
  70. <fieldset>
  71. <legend>设置新 Cookie</legend>
  72. <form action="setCookie.jsp" method="POST">
  73. <table>
  74. <tr><td>name: </td>
  75. <td><input name="name" type="text"
  76. style="width:200px; ">
  77. </td>
  78. </tr>
  79. <tr><td>value: </td>
  80. <td><input name="value" type="text"
  81. style="width:200px; ">
  82. </td>
  83. </tr>
  84. <tr><td>maxAge: </td>
  85. <td><input name="maxAge" type="
  86. text" style="width:
  87. 200px; "></td>
  88. </tr>
  89. <tr><td>domain: </td>
  90. <td><input name="domain" type="text"
  91. style="width:
  92. 200px; "></td>
  93. </tr>
  94. <tr><td>path: </td>
  95. <td><input name="path" type="text"
  96. style="width:200px; ">
  97. </td>
  98. </tr>
  99. <tr><td>comment: </td>
  100. <td><input name="comment" type="text"
  101. style="width:
  102. 200px; "></td>
  103. </tr>
  104. <tr><td>secure: </td>
  105. <td><input name="secure" type="text"
  106. style="width:
  107. 200px; "></td>
  108. </tr>
  109. <tr><td></td>
  110. <td><input type="submit" value=" 提 交 " class=
  111. "button">
  112. <input type="button" value=" 刷 新 " onclick=
  113. "location='setCookie.jsp'">
  114. </td>
  115. </tr>
  116. </table>
  117. </form>
  118. </fieldset>
  119. </div>
  120. </body>
  121. </html>

3. Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

 
  
  1. Cookie cookie = new Cookie("username", "helloweenvsfei");
  2. // 新建Cookie
  3. cookie.setMaxAge(Integer.MAX_VALUE);
  4. //设置生命周期为MAX_VALUE
  5. response.addCookie(cookie);
  6. // 输出到客户端

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,例如:

 
  
  1. Cookie cookie = new Cookie("username", "helloweenvsfei");
  2. // 新建Cookie
  3. cookie.setMaxAge(0); //
  4. 设置生命周期为0,不能为负数
  5. response.addCookie(cookie); //
  6. 必须执行这一句

response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。

注意:

从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

4. Cookie的修改与删除

Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,并添加到response中覆盖原来的Cookie。

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。

注意:

修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。


目录
相关文章
|
7天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
48 10
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
12天前
|
Java 编译器
探索Java中的异常处理机制
【10月更文挑战第35天】在Java的世界中,异常是程序运行过程中不可避免的一部分。本文将通过通俗易懂的语言和生动的比喻,带你了解Java中的异常处理机制,包括异常的类型、如何捕获和处理异常,以及如何在代码中有效地利用异常处理来提升程序的健壮性。让我们一起走进Java的异常世界,学习如何优雅地面对和解决问题吧!
|
13天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
29 4
|
11天前
|
Java 数据库连接 开发者
Java中的异常处理机制及其最佳实践####
在本文中,我们将探讨Java编程语言中的异常处理机制。通过深入分析try-catch语句、throws关键字以及自定义异常的创建与使用,我们旨在揭示如何有效地管理和响应程序运行中的错误和异常情况。此外,本文还将讨论一些最佳实践,以帮助开发者编写更加健壮和易于维护的代码。 ####
|
15天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
42 4
|
16天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
17天前
|
安全 IDE Java
Java反射Reflect机制详解
Java反射(Reflection)机制是Java语言的重要特性之一,允许程序在运行时动态地获取类的信息,并对类进行操作,如创建实例、调用方法、访问字段等。反射机制极大地提高了Java程序的灵活性和动态性,但也带来了性能和安全方面的挑战。本文将详细介绍Java反射机制的基本概念、常用操作、应用场景以及其优缺点。 ## 基本概念 ### 什么是反射 反射是一种在程序运行时动态获取类的信息,并对类进行操作的机制。通过反射,程序可以在运行时获得类的字段、方法、构造函数等信息,并可以动态调用方法、创建实例和访问字段。 ### 反射的核心类 Java反射机制主要由以下几个类和接口组成,这些类
36 2
|
20天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
21天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
40 2

热门文章

最新文章

下一篇
无影云桌面