Cookie概述及示例

------------------------------------Cookie概述及示例-------------------------------------------

  1. 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:

 

猜你喜欢

转载自blog.csdn.net/weixin_41547486/article/details/81294206