什么是Cookie?
Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等。
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie的原理?
首先给大家看一张从网上找的一张图,我觉得不错,能够帮助大家理解,如下所示:
简单的说一下Cookie的原理:
客户端在第一次向浏览器发送请求Request的时候,做了特定的操作,比如:选择了记住密码的选项。到达服务端之后,服务端作出响应,发送给客户端需要的请求,同时会在响应Response中添加一个Cookie的对象,这个对象保存的信息通过Set-Cookie进行摄入。这样客户端就可以保存它和服务器的会话信息了,等到客户端再次向服务器发送请求Request时,就会带着Cookie对象的信息,这样服务器就可以根据Cookie的信息,对客户端做出相应的响应。
怎么用Cookie?
关于如何在我们的程序中应用Cookie,来看一个小例子——保存用户名。
新建一个DServlet,用来充当服务器,使用JSP页面充当客户端,来模拟Cookie的工作原理,配置文件啥的就不说了。服务端的代码如下:
public class DServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获得用户名
String userName = request.getParameter("userName");
Cookie cookie = new Cookie("remember",userName);
// 2.获得复选框选中状态
String remember = request.getParameter("remember");
// 3.根据刚才判断的状态.创建cookie,并设置有效时间
if(remember!=null && remember.equals("yes")){
//需要记住密码 ==> 记两个礼拜
cookie.setMaxAge(60*60*24*7*2);
}else{
//不需要记住密码 或 删除已经记住的密码
cookie.setMaxAge(0);
}
// 4.向客户端发送cookie
response.addCookie(cookie);
// 5.跳转登陆成功页面
response.sendRedirect("/day11-cookie/index.jsp");
}
}
登录的JSP页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登录</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<%
//取得浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
if(cookies!=null &&cookies.length>0){
for(Cookie c : cookies){
if(c.getName().equals("remember")){
cookie = c;
}
}
}
//取得到 ==> 将取到的用户名填入到 输入框中
if(cookie!=null){
String userName = cookie.getValue();
//将cookie中记录的用户名放到 page域
pageContext.setAttribute("userName", userName);
}
//取不到 ==> 什么也不做
%>
<body>
<form action="/day11-cookie/DServlet" method="post" >
用户名:<input type="text" name="userName" value="<%=pageContext.getAttribute("userName")==null?"":pageContext.getAttribute("userName") %>" /><br/>
密 码:<input type="password" /><br/>
<input type="checkbox" name="remember" value="yes" <%=pageContext.getAttribute("userName")==null?"":"checked"%> />记住我<br/>
<input type="submit" value="登陆" style="width:100px;height:40px" /><br/>
</form>
</body>
</html>
不勾选“记住我”,我们点击登陆,查看一下浏览器的Cookie信息(以Firefox为例),如下图所示:
我们看到Cookie中除了程序运行的会话JSESSIONID之外,并没有其他的Cookie信息,而当我们在登陆的时候,将记住我勾选,则会看到Cookie信息中有了我们添加的内容,并且内容就是我们填写的用户名,这样在下一次登陆时,自动填写用户名。
小结一下:
Cookie的应用,的确为我们带来了很多便利,比如几乎所有的购物网站都有的购物车功能,若是没有Cookie或者类似技术,是不可能实现的,还有我们买车票的时候,会提示在限定的时间内完成支付等等都需要Cookie技术的支持。当时Cookie也有其自身的问题。
第一,安全性问题,众所周知,Cookie通常保存着用户的敏感信息,因此Cookie也就成为了众多Hacker关注的对象,借此来取得特殊权限、甚至攻克整个网站。比如Cookie欺骗,但是我们也可以通过JavaScript等技术对其进行控制。
第二,很多场合的电脑是公用的,因此你在某些网站所做的设置就会保留在这台电脑上,当别人再使用这台电脑的时候就可能会看到你的信息。
第三,当我们的浏览器出了问题,在解决的时候,可能会将你电脑上所有的Internet临时文件删除,这样的话你的所有Cookie文件将会丢失。当你再次访问之前的网站时,你所设置的一些个性化设置将不复存在,网站就会将你视为一个新的用户。同理,当你使用不同的电脑,访问同一个网站时,网站也是会将你当做几个用户来对待,因为几个电脑的Cookie信息不一样。