一、Cookie简介

  Cookie是网站发送的一小段数据,在用户访问浏览网站时通过浏览器存储在用户的计算机上。

  主要用于记录一些用户状态信息,例如记录用户的账号,当前所在地等,根据这些信息网站

  可以提供更精确的服务以及个性化的功能。

  HTTP本身是无状态的,Cookie可以看做是对其的一种补充。比有个商人叫HTTP经常和我们做交易,

  但是HTTP没有记性,他不记得之前和我们做的交易的相关信息,它想了一个办法每次交易后写个纸条,

  把一些关键信息存下来,还在给这个纸条设置下有效期,以及各种信息(比如交易双方是谁才有效等)。

  然后把这个纸条给我们保存起来,下次交易的时候我们把这个纸条给HTTP,它就会根据记录的信息和我们

  交易。这个纸条就是Cookie。

  1.Cookie设置过程:

  1.1.1用户发送请求(初次请求,此时用户本地没有Cookie)。(相当于我们和商人第一次交易)

  1.1.2服务器响应+设置Cookie保存在用户本地。(交易完后商人写个纸条给我们保存。)

  1.1.3用户发送请求+Cooike。(下一次交易时,我们把纸条給商人。)

  1.1.4服务器响应。(商人根据纸条记录的信息和我们进行交易。)

  2.Cookie有效期

  Cookie的有效期通过void setMaxAge(int expiry)设置。

  expiry以秒为单位指定Cookie的有效期,expiry如果为负则代表该Cookie存储在浏览器内存中,

  即浏览器不关闭时有效,关闭后该Cookie无效。(默认为-1)

  如果为0则表示删除此Cookie。

  为正数则代表该Cookie存活时间,expiry单位为秒。

  

  不同浏览器Cookie不共享。

  3.Cookie的域和路径

    3.1Cookie的域

    Cookie是区分域的,即区分那些域名可以访问Cookie。

    例如www.baidu.com的Cookie不会提交到www.google.com上。

    Cookie的域默认为当前请求资源的域名。

    例如先向www.baidu.com发送请求,服务器会将一些Cookie写到浏览器。

    这个Cookie的域就是.baidu.com。后续浏览器再向www.google.com发送请求时

    不会发送域为.baidu.com的Cookie.

    Cookie的域可以通过public void setDomain(java.lang.String pattern)设置。

    pattern必须以‘.’开头,例如.baidu.com

    就代表该cookie可以被www.baidu.com服务区读取。

    name相同,但域不相同的Cookie认为是不同Cookie。

    

    3.2Cookie的路径

    Cookie的路径是区分项目下那些路径可以使用那些Cookie。

    默认为‘/’即根目录下(即默认域下所有应用)都可以使用Cookie。

    以访问www.google.com为例

    假如设置Cookie1路径为/testServlet/则www.google.com下的testServlet可以访问Cookie1。

    接着再设置一个Cookie2位/testServlet/temp1/,则Cookie2只能被www.google.com下的/testServlet/temp1/

    下的资源访问,/testServlet/下的其他目录,例如/testServlet/temp2/可以访问Cookie1,

    但不能访问Cookie2.

    

    路径还可以和域配合使用,

    例如先设置域 setDomain(.google.com);

    然后设置路径 setPaht("/app1/");

    代表只有位于www.google.com服务器下的app1才能使用该Cookie。

二、Cookie实例

  Cookie实现保存记住密码。

  程序流程:

  先访问LoginServlet

  LoginServlet功能:

  if(Cookie存在){

    获取Cookie中username和password;

    将值设置到登录界面;

  }

  请求转发到登录页面;

  登录界面点击提交后调用LoginCheckServlet  

  LoginCheckServlet功能:

  if(用户名密码正确 && Cookie为空 && 已选择记住密码){

    设置Cookie;//不正确的密码不进行记录

  }

  检查用户名和密码并输出页面。

  

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Login</title>
  8. </head>
  9. <body>
  10. <!-- http://localhost:8080/ -->
  11. <form name = f1 action = "/TestServlet/LoginCheck" method = "post">
  12. username:<input type = "text" name = "username" value = "${un}"></input><br>
  13. password:<input type = "password" name = "password" value = "${pw}"></input><br>
  14. 记住密码 :<input type = "radio" name = "SavePassword" value = "1"><br>
  15. <input type = "submit" value = "登录">
  16. </form>
  17. </body>
  18. </html>

LoginServlet:主要功能如果有Cookie则设置Cookie数据到登录界面,最后跳转到登录界面。

如果是之前已经选择记住密码且登录正确,则登录界面会自动填充之前输入的用户名和密码。

反之,登录界面则没有数据填充。

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.Cookie;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class Login extends HttpServlet{
  11. private String username = null;
  12. private String password = null;
  13. @Override
  14. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15. // TODO Auto-generated method stub
  16. resp.setCharacterEncoding("utf-8");
  17. PrintWriter out = resp.getWriter();
  18. Cookie[] cookies = req.getCookies();
  19. //如果Cookie存在,获取Cookie信息设置到登录界面。
  20. if(cookies != null) {
  21. username = req.getParameter("username");
  22. password = req.getParameter("password");
  23. findUserAndPasswordCookies(cookies);
  24. req.setAttribute("un", username);
  25. req.setAttribute("pw", password);
  26. }
         //请求转发到登录界面
  27. req.getRequestDispatcher("/login.jsp").forward(req, resp);
  28. }
  29.  
  30. @Override
  31. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  32. // TODO Auto-generated method stub
  33. doGet(req, resp);
  34. }
  35.  
  36. //从Cookie中寻找用户名以及密码
  37. private void findUserAndPasswordCookies(Cookie[] cookies) {
  38. for(Cookie c:cookies) {//遍历Cookies选择用户名和密码
  39. if("username".equals(c.getName())) {
  40. username = c.getValue();
  41. }
  42. if("password".equals(c.getName())) {
  43. password = c.getValue();
  44. }
  45. }
  46. }
  47. }

LoginCheckServlet:如果没有Cookie,用户密码输入正确,且已勾选记住密码则设置Cookie。

最后后检查密码,并输出界面。

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3.  
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.Cookie;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. public class LoginCheck extends HttpServlet{
  11. private String username = null;
  12. private String password = null;
  13.  
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. //设置编码格式为utf-8
  17. resp.setCharacterEncoding("utf-8");
  18. PrintWriter out = resp.getWriter();
  19. username = req.getParameter("username");
  20. password = req.getParameter("password");
  21. //如果登录密码正确,Cookie为空且用户已选择记住密码,则设置Cookie
  22. if(checkPassword() && req.getCookies() == null &&
  23. "1".equals(req.getParameter("SavePassword"))) {
            //设置Cookie
  24. setUserAndPasswordCookies(username, password, req , resp);
  25. }
  26. //检查密码,并输出界面
  27. checkUserAndPassword(username,password, out);
  28. }
  29.  
  30. @Override
  31. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  32. doGet(req, resp);
  33. }
  34.  
  35. //设置Cookie
  36. private void setUserAndPasswordCookies(String username, String password,
  37. HttpServletRequest req ,HttpServletResponse resp) {
  38. //设置Cookie
  39. Cookie usernameCookie = new Cookie("username",username);
  40. Cookie passwordCookie = new Cookie("password",password);
  41. //设置存在时间为一周
  42. usernameCookie.setMaxAge(60*60*24*7);
  43. passwordCookie.setMaxAge(60*60*24*7);
  44. //添加Cookie
  45. resp.addCookie(usernameCookie);
  46. resp.addCookie(passwordCookie);
  47. }
  48.  
  49. //检查输入的用户名和密码是否正确。此处使用固定值测试。
  50. private void checkUserAndPassword(String username,String password, PrintWriter out) {
  51. //打印HTML头部代码
  52. printHtmlPage(out,true);
  53. if(checkPassword()) {
  54. out.println("<h1>欢迎" + username + "登录!</h1>");
  55. }else {
  56. out.println("<h1>登录失败!</h1>");
  57. }
  58. //打印HTML尾部代码
  59. printHtmlPage(out,false);
  60. }
  61.  
  62. //打印HTML页面,head为True打印HTML头部代码,为false打印尾部HTML代码
  63. private void printHtmlPage(PrintWriter out, boolean head) {
  64. if(head) {
  65. out.println("<!DOCTYPE html>\r\n" +
  66. "<!-- http://localhost:8080/TestServlet/Test.html -->\r\n" +
  67. "<html>\r\n" +
  68. "<head>\r\n" +
  69. "<meta charset=\"UTF-8\">\r\n" +
  70. "<title>Insert title here</title>\r\n" +
  71. "</head>\r\n" +
  72. "<body>");
  73. }else {
  74. out.println("</body>\r\n" +
  75. "</html>");
  76. }
  77. }
  78.  
  79. //检查用户名、密码,正确返回true,反之返回false
  80. private boolean checkPassword() {
  81. if("hcf".equals(username) && "123456".equals(password))
  82. return true;
  83. else
  84. return false;
  85. }
  86. }

先访问LoginServlet,输入用户名hcf,密码123456.

勾选记住密码然后点击登录,弹出登录成功界面。

然后再次访问LoginServlet,此时的登录页面已经填充好了用户名和密码。

参考资料:https://en.wikipedia.org/wiki/HTTP_cookie#Domain_and_path

        http://www.cnblogs.com/andy-zhou/p/5360107.html

  

1.5(学习笔记)Cookie的更多相关文章

  1. Web客户端数据存储学习笔记——Cookie

    今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...

  2. 重温Servlet学习笔记--Cookie对象

    首先要了解cookie必须得先了解http协议,,Cookie是http协议指定的,先由服务器保存cookie到浏览器,在下次浏览器请求服务器时把上次请求得到的cookie归还给服务器,cookie以 ...

  3. Web安全测试学习笔记(Cookie&Session)

    一,Session:含义:有始有终的一系列动作\消息1, 隐含了“面向连接” 和“保持状态”两种含义2, 一种用来在客户端与服务器之间保持状态的解决方案3, 也指这种解决方案的存储结构“把××保存在s ...

  4. 20151224jquery学习笔记---cookie插件

    hello,祝自己平安夜快乐. Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登录信息.购物数据信息等一系列微小信息.一. 使用 cookie 插件官方网站: htt ...

  5. JS学习笔记 - cookie设置、读取、删除

    <script> // 设置cookie function setCookie(name, value, iDay) { var oDate = new Date(); oDate.set ...

  6. [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. [原创]java WEB学习笔记29:Cookie Demo 之自动登录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  10. Javaweb学习笔记5—Cookie&Session

    今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...

随机推荐

  1. kafka.common.ConsumerRebalanceFailedException异常解决

    kafka.common.ConsumerRebalanceFailedException: group_dd-1446432618163-2746a209 can't rebalance after ...

  2. IDEA 用maven创建web项目编译时不能发布resources中的文件

    1.在pom.xml加入 <build> <resources> <resource> <directory>${basedir}/src/main/j ...

  3. CF502C The Phone Number

    C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes     Mrs. Smith ...

  4. Python小程序之购物车

    需求: 用户入口: 1.商品信息放在文件中,从文件中读取 2.已购商品,余额记录,第一要输入起始金额,以后不需要二次输入 商家入口: 2.可以添加商品,修改商品价格 # Author:Lee Siri ...

  5. django原生sql

    参考:http://www.jb51.net/article/128257.htm coding=utf-8 from django.core.paginator import Paginator d ...

  6. 定制一个支持中英文的简单LaTex模板

    平常写汇报文档什么的,word排版有时还是比较费劲,遂定制一个简单的LaTex模板,中文默认为宋体,英文为LaTex默认字体,支持彩色高亮展示,有目录书签,有页眉展示,大致如下: LaTex代码如下: ...

  7. 2.如何使用python连接hdfs

    总所周知,python是一门很强大的语言,主要在于它有着丰富的第三方模块,当然连接hdfs的模块也不例外. 在python中有一个模块也叫hdfs,可以使用它连接hadoop的hdfs.直接pip i ...

  8. HDU-5074

    Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  9. iOS运行时,如何增加成员变量

    必须实现getter和setter方法 ``` - (void)setName:(NSString *)name { /** * 为某个类关联某个对象 * * @param object#> 要 ...

  10. pycurl mac 安装报错Curl is configured to use SSL,

    1.使用安装第三方插件的方式安装pycurl:pip3 install pycurl 报错提示如下: Curl is configured to use SSL, but we have not be ...