Cookie概述及示例
------------------------------------Cookie概述及示例-------------------------------------------
- Cookie概述
- 什么叫Cookie
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
- 2 Cookie规范
你大可以放心,Cookie不会占满你的硬盘。因为一个Cookie最多只有4KB,并且浏览器最多可以保存300个Cookie。当然,在浏览器大战的今天,一些浏览器为了打败对手,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!
不同的浏览器之间不能共享Cookie!!!
- 3 Cookie的作用
Cookie的作用可大了,但无论怎么夸大Cookie的作用都离不开“跟踪客户端状态”这句话。我们知道Cookie是服务器保存在客户端的信息,然后客户端会在下次请求时把Cookie在还给服务器,这样服务器就可以通过信息来识别客户端了。
代码示例:
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //获取用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password");
System.out.println("用户名:"+username); System.out.println("密码:"+password); //将用户和密码赋给regist属性 request.setAttribute("username",username); request.setAttribute("passward",password); //如果跳转到regist1.html页面,这时当前servlet的request作用就消失了 //如果跳转到的是servlet,那么当前servlet的request域作用继续存在 request.getRequestDispatcher("/regist1.html").forward(request, response); } } |
public class Regist1Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得性别 String gender = request.getParameter("gender"); //获得职位 String job = request.getParameter("job"); //获得用户和密码 String username = (String)request.getAttribute("username"); String password = (String)request.getAttribute("password");
switch(gender){ case "1" : gender="男"; break; case "2" : gender="女"; break; }
switch(job){ case "1" : job="讲师"; break; case "2" : job="构架师"; break; } //设置response的类型和编码 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //打印到页面上 response.getWriter().println("<h1>注册成功</h1>"); response.getWriter().println("<hr>"); response.getWriter().println("用户名:"+username+"<br>"); response.getWriter().println("密码:"+password+"<br>"); response.getWriter().println("性别:"+gender+"<br>"); response.getWriter().println("职位:"+job+"<br>"); //因为当前servlet中的request是新的对象,所以是获取不到上一个servlet的request属性 //那么用户名和密码打印为null
}
} |
2 Cookie的示例
- 保存Cookie到客户端
这是响应工作的一部分,所以这个方法是response对象的。并且Cookie是HTTP协议中的内容,所以保存Cookie是HttpServletResponse类的方法。
void addCookie(Cookie c):添加Cookie对象到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中。
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie c = new Cookie("name", "renliang"); response.addCookie(c); } } |
使用浏览器访问http://localhost/day06_03/AServlet,然后通过HttpWatch查看响应头信息中是否存在Set-Cookie这个头信息。
当再交方法http://localhost/day07_03/AServlet时,查看请求头信息中是否存在Cookie这个头信息。当然也可以尝试访问http://localhost/day07_03/BServlet是否在请求头中存在Cookie这个头信息。
尝试访问http://localhost/day07_03/BServlet,你可能会说,BServlet不存在,没错,BServlet是不存在,但我们只关心请求,而不关心响应。我们只需要看看在请求中是否存在Cookie这个头信息。你应该已经尝试过了,也看到了Cookie请求头信息。这说明不只是访问AServlet才会有Cookie请求头信息,而是只要访问这个day07_03就会有Cookie这个请求头。
Cookie的大小是有限的,浏览器最多可以保存300个Cookie,一个Cookie最多只有4KB,如果超出最大容量就会报如下错误。
- 服务器端读取Cookie
我们现在已经可以保存Cookie到客户端了,但还没有学习让服务器如何读取Cookie。
如果浏览器保存了Cookie,那么会在下一次请求时把Cookie放到请求头中发送给服务器,这时服务器需要在请求中读取Cookie。既然是在请求中读取,那么当然是使用request对象来读取了。
HttpServletRequest:Cookie[] getCookies()
注意,它返回的是Cookie数组,而不是一个Cookie对象。如果请求中没有Cookie,那么该方法返回null。
Cookie[] cs = request.getCookies(); if (cs != null) { for (Cookie c : cs) { String str = c.getName() + ": " + c.getValue() + "<br/>"; response.getWriter().print(str); } } |
Cookie存写代码示例:
RegistServlet存储cookie
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //获取用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password");
System.out.println("用户名:"+username); System.out.println("密码:"+password);
//创建cookie对象,将用户名和密码连接存储,使用逗号分开 Cookie cookie = new Cookie("userpass", username+","+password);
//把cookie写入浏览器 response.addCookie(cookie);
//跳转页面 request.getRequestDispatcher("/regist1.html").forward(request, response); }
} |
RegistServlet1读取cookie
public class Regist1Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得性别 String gender = request.getParameter("gender"); //获得职位 String job = request.getParameter("job");
//从浏览器中来读取当前项目的所有cookie Cookie[] cookies = request.getCookies(); String userpassVal = null; //遍历cookies for (Cookie cookie : cookies) { //获取cookie的name String cookieName = cookie.getName(); if("userpass".equals(cookieName)){ //获得cookie的值 userpassVal = cookie.getValue(); } }
String username = null; String password = null; if(userpassVal != null){ //将用户密码字符串进行分割 String[] upValues = userpassVal.split(","); //将分割后的字符串数组赋给相对应的用户和密码 username = upValues[0]; password = upValues[1]; }
switch(gender){ case "1" : gender="男"; break; case "2" : gender="女"; break; }
switch(job){ case "1" : job="讲师"; break; case "2" : job="构架师"; break; } //设置response的类型和编码 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //打印到页面上 response.getWriter().println("<h1>注册成功</h1>"); response.getWriter().println("<hr>"); response.getWriter().println("用户名:"+username+"<br>"); response.getWriter().println("密码:"+password+"<br>"); response.getWriter().println("性别:"+gender+"<br>"); response.getWriter().println("职位:"+job+"<br>"); } } |
360浏览器查看存储的cookie: