一:简介
Cookie主要用来存储用户信息,追踪用户会话。web客户端访问服务端直接采用的协议是Http,Http协议是一种无状态协议,无状态表现在不能够保留用户访问状态,无法记录用户信息。每一次的请求,在响应后就会断开,再次访问的时候就会是一个新的请求。比如用户A访问了一次服务,再次访问的时候服务端无法得知该用户是否还是A,它会当做是一个新的用户。为了解决这一问题,产生了Cookie。
用户首次访问的时候,服务端会记录该用户的信息(或者说身份凭证),当再次访问服务的时候,服务端要求客户端携带用户信息,服务端进行确认。辨别出是哪个用户,哪个会话。
Cookie中是以键值对的方式存储信息的。它并没有提供专门的修改和删除Api,往往要达到这个功能,需要重新定义同名称的Cookie值进行覆盖[更新]、如果是删除操作,那么不仅要定义一个同名的Cookie,并且需要吧maxAge设置为0,表明该Cookie的有效期为0[即代表删除]。
二:属性列表
三:Cookie的不可跨域性
同一个浏览器,访问不同的网址(服务器),如一个访问百度,一个访问谷歌,可能两个服务都需要Cookie信息。但是你在后端服务中操作Cookie的时候,百度的只能操作百度的Cookie;谷歌仅能操作谷歌的Cookie,两者是不会交叉的。原因是浏览器已经对其进行了区分,依据的就是域名。比如:www.google.com和www.image.google.com两个虽然都是google旗下的,但是也属于不同的域名,所以Cookie也是不同的。【但是反过来说,你如果访问了Google的某个产品,然后进行了登录操作。那么再访问其他Google产品的时候不用进行登录则可以直接进行操作,关键是调整了domain属性】
四:代码演示
本例演示利用Cookie保存用户信息,并记录网站的访问次数:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page isErrorPage="true" %> <% //设置请求和响应的编码格式 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); if("POST".equals(request.getMethod())){ //保存Cookie信息 Cookie nameCookie = new Cookie("username",request.getParameter("name")); Cookie visitTimesCookie = new Cookie("visitTimes","0"); response.addCookie(nameCookie); response.addCookie(visitTimesCookie); //记录用户信息完毕,重定向到cookie.jsp response.sendRedirect("./cookie.jsp"); return; } %> <!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=UTF-8"> <title>登录界面</title> </head> <body> <form action="./login.jsp" method="POST"> <table> <!-- 输出错误信息 --> <tr> <td colspan="2"><%=exception.getMessage()%></td> </tr> <tr> <td>账号:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="pwd"></td> </tr> </table> <input type="submit" value="登录"> </form> </body> </html>
cookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page errorPage="./login.jsp" %> <% //设置请求和响应的编码格式 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); Cookie[] cookies = request.getCookies(); String username = ""; int visitTimes = 0; for(int i=0;i<cookies.length;i++){ //获取单个Cookie Cookie cookie = cookies[i]; System.out.println(cookie); if("username".equals(cookie.getName())){ //获取用户名 username = cookie.getName(); }else if("visitTimes".equals(cookie.getName())){ visitTimes = Integer.parseInt(cookie.getValue()); } if(username==null || username.trim().equals("")){ //抛出异常,则跳转到error界面[login.jsp] throw new Exception("您还没有登录,请先登录!"); } } //修改Cookie信息,更新访问次数,覆盖Cookie中的visitTimes字段 Cookie newCookie = new Cookie("visitTimes",String.valueOf(++visitTimes)); //设置Cookie response.addCookie(newCookie); %> <!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=UTF-8"> <title>会话跟踪:跟踪用户的整个会话</title> </head> <body> <h4>登录信息</h4> <hr> <span>您的账号:</span><span><%=username %></span><br> <span>访问次数:</span><span><%=visitTimes %></span><br> <button onclick="refresh()">刷新</button> <script type="text/javascript"> function refresh(){ var time = new Date().getTime(); window.location.href='./cookie.jsp?ts='+time; } </script> </body> </html>