Servlet与JSP核心编程 ---- 7

本文介绍如何使用Cookie进行用户标识及定制服务,探讨了Cookie在隐私方面的潜在问题,并提供了最佳实践建议。文章还详细讲解了如何在Servlet中创建、发送和接收Cookie。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第八章 cookie管理

 

8.1

• 思想

– servlet发送简单的名称和值到客户程序。

– 客户程序在访问同一站点(或同一域,依cookie设置

的不同而定)时将名称和值原样返回。

• cookie的典型应用

– 在电子商务会话中标识用户

• 针对这项任务servlet拥有专门的高层API

– 避免存储用户名和密码

– 对站点进行定制

– 定向广告

 

8.2 与cookie相关的一些问题

• 问题在于隐私,不是安全。

– 服务器能够记住您之前的动作。

– 如果您给出自己的个人信息,服务器能够将这些信息

与您之前的动作关联起来。

– 多个服务器能够通过提供协作服务的第三方,如

doubleclick.net,共享cookie信息。

– 设计欠考虑的网站直接将敏感的信息,如信用卡号码

,存储在cookie中。

– JavaScript的bug能够使敌对网站窃取cookie (老浏览器)

• servlet作者应该遵守下面这些法则

– 如果cookie对于您的任务并非至关重要,则要避免在

cookie被禁用时servlet完全不能工作。

– 不要将敏感的信息存储在cookie中。

 

8.4 cookie 的发送和接收

1.向客户程序发送cookie

• 创建Cookie对象。

– 调用Cookie的构造函数,给出cookie的名称和cookie的

值,二者都是字符串。

Cookie c = new Cookie("userID", "a1234");
 

 

• 设置最大时效。

– 如果要告诉浏览器将cookie存储到磁盘上,而非仅仅

保存在内存中,使用setMaxAge (参数为秒数)。

c.setMaxAge(60*60*24*7); // One week
 写道
创建cookie对象后,将cookie发送到客户程序之前,一般应该调用setMaxAge方法。
  

 

• 将Cookie放入到HTTP响应中

– 使用response.addCookie。

– 如果忘记这一步,那么不会有任何cookie被发送到浏

览器!

response.addCookie(c);

创建和操作Cookie对象对客户应用程序没有任何影响。必须显式地调用response.setCookie将cookie发送到客户端。

 

sample

Cookie userCookie = new Cookie("user", "uid1234");
userCookie.setMaxAge(60*60*24*365); // Store cookie for 1 year
response.addCookie(userCookie);
 

2.从客户端读取cookie

• 调用request.getCookies

– 这会得到Cookie对象组成的数组。

• 在这个数组中循环,调用每个对象的getName,直到找

到想要的cookie为止。

– 根据应用程序的具体情况使用这个值(getValue)。

String cookieName = "userID";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for(int i=0; i<cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName())) {
doSomethingWith(cookie.getValue());
}
}
}
 

8.5 使用cookie检测初访者

错误方法:

Cookie[] cookies = request.getCookies();
if (cookies == null) {
doStuffForNewbie(); // Correct.
} else {
doStuffForReturnVisitor(); // Incorrect.
}
 

the right way:

package coreservlets;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
/** Servlet that says "Welcome aboard" to first-time
* visitors and "Welcome back" to repeat visitors.
* Also see RepeatVisitor2 for variation that uses
* cookie utilities from later in this chapter.
*/
public class RepeatVisitor extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
boolean newbie = true;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for(int i=0; i<cookies.length; i++) {
Cookie c = cookies[i];
if ((c.getName().equals("repeatVisitor")) &&
// Could omit test and treat cookie name as a flag
(c.getValue().equals("yes"))) {
newbie = false;
break;
}
}
}
String title;
if (newbie) {
Cookie returnVisitorCookie =
new Cookie("repeatVisitor", "yes");
returnVisitorCookie.setMaxAge(60*60*24*365); // 1 year
response.addCookie(returnVisitorCookie);
title = "Welcome Aboard";
} else {
title = "Welcome Back";
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n";
out.println(docType +
"<HTML>\n" +
"<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" +
"</BODY></HTML>");
}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值