前言
Servlet的学习进行到Cookie了,对于Cookie也有了一个自己的理解。想着把自己的总结
记录下来,形成一份博客。话说笔者这几天都没写博客了,突然感觉不知从何说起,真是有待
提高啊。
Cookie介绍和由来
● Cookie你从哪里来?
在前面的对HTTP的协议中,我们知道了HTTP是一种无状态的协议,这种方式使得web服务器
不知道用户上一次访问服务器干了什么,严重的阻碍了交互式web应用程序的实现。一个简单的
例子就是我们在登录过一次网站后退出,在进行登录还的去填写登录信息,虽然这种方式安全性
比较高,不过总归是一件特别麻烦的事。基于这种情形,Cookie技术就形成了。
● Cookie是什么?
用大白话来说Cookie就是一堆数据,其组织形式是以键值对的形式组织的。在交互式web应用
中十分有用,它是服务器在客户端保存的一些信息,例如用户名、密码,这些信息是加密了的。
这就是Cookie,Cookie的信息并不大,就好像是小甜饼一样。而且Cookie的大小一般不能超过
4kb。
Cookie和web服务器的交互
知道了Cookie的由来和Cookie就是一堆键值对数据,那么Cookie是如何和web服务器进行交
互 从而完成交互式的web应用的呢?简单的看下图就明白了:
具体流程如下图:
Cookie可爱之处
了解了Cookie与服务器的交互过程,我们思考一个问题:cookie究竟能干什么?
典型的应用就是判定用户注册是是否已经注册(实现检测是否存在cookie可以减轻服务器压力)、
记住用户名、密码功能可以让我们登录网站的时候快捷一些,网上商店购物车的运用。
源码实例
知道了Cookie的可爱之处,那么我们来看看Cookie在Servle中是如何来操作的吧?
这里我们以一个简单的“登录记住”为例。通过Cookie实现下次登录记住用户名,
密码的功能。
首先看看LoginServle的代码情况,这里主要是在doPost方法中处理的。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String record = request.getParameter("record");
//第一次登陆根据record是否被选择来确定是否使用cookie
if(record.equals("yes"))
{
//使用cookie
//1、首先在服务器创建Cookies
Cookie nameCookie = new Cookie("username", username);
Cookie passCookie = new Cookie("password", password);
//2、设定cookie存在的时间
nameCookie.setMaxAge(30*60*24);//设置Cookie存在的时间,以秒为单位
passCookie.setMaxAge(30*60*24);
//3、创建cookie并保存到客户端
response.addCookie(nameCookie);
response.addCookie(passCookie);
//用户名验证
if(username.equals("kiritor")&&password.equals("kiritor"))
request.getRequestDispatcher("index.jsp").forward(request, response);
else
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
这样我们在用户第一次登录之后,用户如果选择记住密码之后,服务器就生成了
cookie对象并通过response对象将其保存在客户端浏览器中了。下次登录的时候我们
就可以通过javaScript代码动态的获取用户名,密码了。
详细情况看代码部分。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>登录</title>
</head>
<body>
<P></P>
<P></P>
<center>
<form action="LoginServlet" method="post" name="form_name">
用户名:<input type="text" name="username" /></br> 密 码:<input type="password"
name="password" /></br> 记住密码<input type="radio" name="record"
value="yes" /> <input type="submit" value="提交" />
</form>
</center>
<script type="text/javascript">
//js获取cookie
var acookie = document.cookie.split("; ");
function getck(sname) {//获取单个cookies
for ( var i = 0; i < acookie.length; i++) {
var arr = acookie[i].split("=");
if (sname == arr[0]) {
if (arr.length > 1)
return unescape(arr[1]);
else
return "";
}
}
return "";
}
//给相应的form里的input赋值
document.form_name.username.value = getck("username");
document.form_name.password.value = getck("password");
</script>
</body>
</html>
可以预见的是进过第一次记住密码并登录之后,下次登录就不需要用户手动输入密码了。
好了一个简单的Cookie例子就完成了,在Servlet中对Cookie到底具有什么操作,这里我们可以
直接阅读Servlet源码,这里笔者对其方法做一个简单的展示
见名知意,根据名字我们就可以得出其方法的目的了,具体作用是什么,笔者也不想多提了。
Cookie藏哪儿?
Cookie的数据时加密的,这里我们想看看它到底长个什么样子。那么Cookie到底藏在哪里
呢? 这个不同浏览器貌似不同。读者如果感兴趣的话可以自己找找看。
可气的Cookie
对于Cookie有一些缺陷,此部分参照维基百科:
http://zh.wikipedia.org/wiki/Cookie
● 不安全性
通过上面的学习我们知道cookie是保存在客户端的,虽然cookie是经过了加密的,但是仍然
存在着极大的安全隐患。
Cookie在HTTP请求是明文传递的,虽然经过加密,但是解密更加强大,Cookie在某种程度
上来说已经严重的危机到用户的隐私安全了,很多情况下,我们接收到的垃圾邮件都是由于使
用cookie造成的。
● 识别不精确
如果在一台计算机中安装多个浏览器,每个浏览器都会以独立的空间存放cookie。因为cookie
中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者
用不同的计算机登录,都会得到不同的cookie信息,另一方面,对于在同一台计算机上使用同一
浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不同的用户名登录。
● 增加流量
Cookie会被附加到每个HTTP请求中,占用了流量
● 存储的数据量太小
Cookie只支持最多4kb的数据,能够给予的存储空间太小
● 偷窃Cookie和脚本攻击
虽然cookies没有中电脑病毒那么危险,但它仍包含了一些敏感信息:用户名,电脑名,
使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人
信息的时候。
这并非危言耸听,跨站点脚本(Cross site scripting)可以达到此目的。在受到跨站点脚本
攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价
值。
Cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手
段进入用户帐户。
Cookie投毒:一般认为,Cookie在储存和传回服务器期间没有被修改过,而攻击者会在
cookie送回服务器之前对其进行修改,达到自己的目的。例如,在一个购物网站的
cookie中包含了 顾客应付的款项,攻击者将该值改小,达到少付款的目的。
这就是cookie 投毒。
总结
Cookie可以帮我们完成一些特别的功能。Cookie有许多的缺陷,但是在一些对安全性要求不
高的应用中,我们还是可以借助Cookie来实现业务需求的。
对于Cookie的缺陷问题,现在也有一些替代方法,这里笔者可以上网自己查阅下:
给个维基百科上的替代方法:http://zh.wikipedia.org/wiki/Cookie