`

servlet和jsp核心编程(第2版)第八章cookie管理学习笔记

 
阅读更多
第八章 cookie管理
核心方法
1.在创建cookie对象后,将cookie发送到客户端程序之前,一般应该调用setMaxAge方法。
2.如果要指定cookie适用于您的网站上的所有URL,使用cookie.setPath("/"),也就是所有页面都接受该cookie
警告
1.创建和操作Cookie对象对客户程序没有任何影响,必须显式地使用response.addCookie将cookie发送到客户端。
学习笔记
、cookie的优点
1.在电子商务会话中标示用户。2.记录用户名和密码。3.定制站点,用户自己定制主页面的外观。用户选择希望看到的哪个天气预报等等。4.定向广告。有cookie的情况下,通过记录之前的搜索,这些网站可以识别出我们的兴趣,从而显示出我们感兴趣的广告,而不是随机的广告。
、cookie存在的一些问题
为了解决cookie引发的隐私问题。1.如果能够在禁用cookie的情况下也为用户提供合理的功能。2.作为servlet和jsp中用到的cookie,我们尽量避免用cookie存储特别敏感的信息。
、cookie的发送和接受
1.向客户程序发送cookie
a.创建cookie对象,给出cookie的名称和cookie的值,两者都是字符串。
Cookie c =new Cookie("userID","a1234")

b.如果我们创建一个cookie,并将它发送到浏览器,默认情况下,它是一个会话级别的cookie,存储在浏览器的内存中,当我们关闭浏览器时,就会被删除,如果我们希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
cookie.setMaxAge(60*60*24*7);//one week.当然最后不要忘了把它放入报头

c.将cookie放入http相应报头
response.addCookie();

综上所述:
Cookie userCookie  = new Cookie("user","uid1234");
	userCookie.setMaxAge(60*60*24*365);
	response.addCookie(userCookie);

2.从客户端读取cookie
a.调用request.getCookies()返回Cookie对象的数组,b.循环Cookie数组,有了cookie的数组之后,我们调用Cookie的getName方法,知道找到一个与您希望的名称想匹配的对象为止。
综上所述:
String cookieName = "userID";
	Cookie [] cookies = request.getCookies();
	for(int i = 0  ; i  <cookies.length; i++){
		Cookie cookie = cookies[i];
		if(cookieName.equals(cookie.getName())){
			doSomething(cookie.getValue());
		}
	}

、使用cookie检测初访者
不能仅因为cookie数组为null就认为用户是个初来者,因为这可能是由于用户将cookie删除或禁用而造成的结果。但是,如果数组非null,也不过是显示客户曾经到过您的网站,并不能说明它访问过我们的servlet。
、使用cookie属性
1.cookie属性只适用于从服务器端输出到客户端的cookie,服务器端来自于浏览器的cookie并没有设置这些属性,因而不要期望通过设置request.getCookies得到的cookie中可以使用这些属性。也就是说,我们在服务器端设置这些值,然后发送给客户端,而这些属性不存在于浏览器返回给服务器的报头,所以我们也不能取出这些cookie的属性。可以这样理解,因为cookie就是用于客户端来保存和用户有关的信息的。而在服务器端我们不需要这些特性。
2.setPath(),如果没有指定一个路径,浏览器只将该cookie返回给发送cookie的页面所在目录中或之下的URL,而setPath("/")指定服务器的所有页面都应该收到该cookie.
3.一般由于cookie的名字和值已经在cookie的构造方法中设置过了,我们只使用cookie的getName和getValue得到cookie的名字和值,而不去设置cookie的名字和值
、区分持续cookie和会话cookie
response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		for(int i = 0 ; i < 3 ;i++){
			Cookie cookie = new Cookie("Session-Cookie"+i,"Cookie-Value-S"+i);
			response.addCookie(cookie);
		}
		for(int i = 0 ; i < 3 ; i++){
			Cookie cookie = new Cookie("Persistent-Cookie"+i,"Cookie-Value-P"+i);
			cookie.setMaxAge(60*60);
			response.addCookie(cookie);
		}
		Cookie [] cookies = request.getCookies();
		String cookieName ;
		String cookieValue ;
		
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 

Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("<table>");
		out.println("<tr>"+"<th>CookieName</th>"+"<th>CookieValue</th>"+"</tr>");
		if(cookies==null){
			out.println("NO Cookies");
		}
		else{
			for(int i = 0 ; i < cookies.length;i++){
				Cookie cookie = cookies[i];
				cookieName = cookie.getName();
				cookieValue = cookie.getValue();
				out.println("<tr><td>"+cookieName+"</td>"+"<td>"+cookieValue

+"</td>"+"</tr>");
			}
		}
		
		
		out.println("</table>");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();

我们来看几种情况,首先我们初次打开浏览器时,显示的应该是No cookies,因为这时只是把完成了把cookie发送给客户端的任务。下面看两种情况,首先当我们刷新该页面时,就会显示
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
但当我们关闭原来的页面,再次打开浏览器访问该页面时,就会发现只出现
Persistent-Cookie0 Cookie-Value-P0
Persistent-Cookie1 Cookie-Value-P1
Persistent-Cookie2 Cookie-Value-P2
这就代表着会话的cookie(也就是没有设置setMaxAge的cookie)只存在于当前浏览会话,如果浏览器关闭了就不复存在,而持续的cookie就会存放在硬盘上,不会以关闭计算机或是关闭浏览器而改变。
当我们把持续cookie存放在硬盘上的时间改的短一点时。
首先当我们过了设置的时间再次刷新首次得到的浏览器客户端时,显示
Session-Cookie0 Cookie-Value-S0
Session-Cookie1 Cookie-Value-S1
Session-Cookie2 Cookie-Value-S2
因为我们并没有关闭浏览器,所以会话cookie并没有消失。而一开始发送给浏览器的持续cookie在硬盘上存放的时间也过了最大的时间限制,所以就会显示会话cookie的值。
而当我们关闭浏览器,然后过了设置的时间再次打开时,就显示No Cookie了。

、修改cookie的值,记录用户的访问计数。
如果我们希望周期性地修改cookie的值应该怎么办?
我们只需要发送相同的cookie名称,但使用不同的cookie的值,如果我们调用setValue是没有用的,因为除了要设置其值以外,

我们还要调用setMaxAge和setPath。
String accessCount = CookieUtilities.getCookieValue(request, "accessCount", "1");
		int count = Integer.parseInt(accessCount);
		LongLivedCookie cookie = new LongLivedCookie("accessCount",String.valueOf(count+1));
		response.addCookie(cookie);
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 

Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.println("You are the "+count+"user");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
分享到:
评论

相关推荐

    林学良Jsp&Servlet学习笔记

    **JSP(Java Server Pages)与Servlet是Java Web开发中的两个核心技术,它们在构建动态网页和处理客户端请求方面起着至关重要的作用。** **JSP技术:** JSP是一种服务器端脚本语言,用于创建动态网页。它允许开发者...

    JSP-Servlet学习笔记第2版.pdf

    由于直接学习笔记的内容没有给出具体的实例代码和详细解释,所以这里只提供了理论层面的知识点。如果需要学习具体实现,可以寻找相关的教程和项目实践来加深理解。同时需要注意的是,由于JSP/Servlet技术相对老旧,...

    head_first_servlet&jsp学习笔记

    【Servlet&JSP基础知识】 ...以上是`head_first_servlet&jsp`学习笔记的主要知识点,涵盖了Servlet和JSP的基础、Web应用架构、MVC模式、会话管理和JSP编程等多个方面,为深入理解和实践Servlet与JSP开发奠定了基础。

    Servlet学习笔记

    ### Servlet学习笔记精炼知识点 #### 一、Servlet初始化与加载机制 1. **Servlet注册与实例化**:在Web应用中,一个Servlet的生命周期始于它的注册与实例化过程。通常,这一过程是在Web服务器启动时,根据`web.xml...

    Servlet初学者笔记+示例代码(学习JSP之前的基础)

    在学习JSP之前,理解Servlet的基本概念和操作是至关重要的。以下是一些关于Servlet的重要知识点: 1. **Servlet的生命周期**: Servlet在服务器端有三个主要阶段:加载、初始化和销毁。当服务器首次接收到对...

    良葛格JspServlet学习笔记.pdf

    ### 良葛格JspServlet学习笔记 #### 一、引言 在现代Web开发领域,特别是Java EE平台中,JSP (JavaServer Pages) 和 Servlet 技术扮演着非常重要的角色。这两种技术共同构成了Java Web应用的基础,分别侧重于用户...

    Servlet笔记

    - Cookie的作用域:一个Servlet/JSP设置的Cookie能够被同一个路径下面或者子路径下面的Servlet/JSP读取。 - **Session**:更复杂的会话管理机制,用于跟踪用户在整个Web应用程序中的活动。通过`HttpSession`接口来...

    韩顺平servlet笔记

    【标题】:“韩顺平servlet笔记”是一个关于Servlet...通过韩顺平的servlet笔记,读者不仅可以学习到Servlet编程的基本技能,还能掌握Tomcat服务器管理和会话管理的实战经验,为开发复杂的Java Web应用打下坚实基础。

    老杜Servlet笔记.zip

    哔哩哔哩上老杜的Servlet笔记。 2020-5-05 Servlet学习 Tomcat 服务器配置 2020-5-08 UML 2020-5-08 Servlet学习 2020-5-09 Servlet学习 2020-5-10 Servlet学习 2020-5-11 Servlet学习---Cookie 2020-5-11 Servlet中...

    jsp自制详细笔记

    【标题】"jsp自制详细笔记"揭示了这个压缩包文件主要涵盖了JavaServer Pages(JSP)和Servlet技术的学习资源,特别适合JavaWeb开发的初学者。JSP是一种动态网页技术,它允许开发者在HTML页面中嵌入Java代码,从而...

    servlet概述以及API中文版及学习笔记综合

    JSP最终会被编译为Servlet类执行,因此从功能上看,JSP并不超出Servlet的范围,只是提供了更简洁的编程模型。 HTTP Servlet API是开发Servlet的核心工具,它定义了一系列接口和类,如`HttpServlet`、`...

    servlet学习笔记

    ### servlet学习笔记详解 #### Tomcat介绍 **Tomcat服务器**是基于Sun公司的JSWDK(Java Servlet and Web Development Kit)发展而来的杰出Servlet/JSP容器。作为Apache-Jakarta项目的一部分,Tomcat不仅能够执行...

    Head First Servlets & JSP 学习笔记

    以上只是《Head First Servlets & JSP》一书中的部分核心知识点,实际内容还包括过滤器、监听器、MVC设计模式、JSTL等更广泛的主题,旨在帮助读者全面理解和掌握Servlet和JSP技术。通过深入学习,开发者能够构建高效...

    Servlet学习笔记4

    ### Servlet学习笔记4 #### 一、URL Pattern详解 在Servlet配置中,URL Pattern是非常重要的一个概念,它决定了Servlet能够响应哪些请求路径。通常来说,URL Pattern可以分为三种类型: 1. **确切路径匹配**:...

    j2ee学习笔记-j2ee学习笔记

    **J2EE学习笔记概述** J2EE(Java 2 Platform, Enterprise Edition)是一个由Sun Microsystems(现已被Oracle收购)开发的平台,主要用于构建企业级的分布式应用系统。它提供了服务器端组件模型、服务和API,支持...

    JSP+DAO留言管理程序(代码+笔记)

    本篇文章将深入探讨这个基于JSP+DAO的留言管理程序,包括其核心概念、工作原理以及实现过程。 一、JSP简介 JSP是一种由Sun Microsystems公司提出的动态网页技术,它允许开发者将Java代码嵌入到HTML页面中,以实现...

    JSP七个小项目代码和笔记汇总

    在"JSP七个小项目代码和笔记汇总"中,每个项目可能涵盖了不同的知识点,比如用户登录系统(涉及session管理)、新闻发布系统(涉及数据库操作)、购物车应用(涉及cookie和session结合使用)等。通过实践这些小项目...

    JSP学习笔记

    ### JSP学习笔记详解 #### 一、JSP基础语法概览 JSP(Java Server Pages)是一种在服务器端执行的脚本语言,用于生成动态网页。它将HTML标记、JavaScript脚本和Java代码结合在一起,使开发者能够创建功能丰富的Web...

Global site tag (gtag.js) - Google Analytics