欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Cookie的使用,及与Session对比

程序员文章站 2023-01-19 15:13:40
Http协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才那个浏览器,简单的说就是服务器不会去记得你,所以就是无状态协议。(超文本传输协议是无状态的) 就像一个没有记忆功能的老板,你每次去他的店里买 ......

Http协议的无状态性

  无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才那个浏览器,简单的说就是服务器不会去记得你,所以就是无状态协议。(超文本传输协议是无状态的)

  就像一个没有记忆功能的老板,你每次去他的店里买个东西,他都觉得你是第一次来这里购买。

保存用户状态的两大机制

  1. session(针对服务端的技术)
  2. cookie(针对客户端的技术)

什么是Cookie

Cookie:是Web服务器保存在客户端的一系列文本信息。

注意是保存在客户端的。

 

比如说登录邮箱的时候提示:十天内免登陆;购物时候的“购物车”都是用Cookie来保存信息的,保存在客户端中。

但是也有缺点:容易泄露用户信息。

 

使用Cookie

 

创建Cookie对象

  • Cookie newCookie=new Cookie(String key,Object value);

写入Cookie对象

  • response.addCookie(newCookie);

读取Cookie对象

  • Cookie[] cookies=request.getCookies();

 

Cookie的使用,及与Session对比

 

Cookie是以文本文件保存在客户端的信息,所以他的value值本质上是一个字符串类型的

小例子

Cookie的使用,及与Session对比

 

 代码只贴出了body标签下的代码

 login.jsp

<body>
    <h1>用户登录</h1>
    <hr>
    <% 
      request.setCharacterEncoding("utf-8");
      String username="";
      String password = "";
      Cookie[] cookies = request.getCookies();
      if(cookies!=null&&cookies.length>0)
      {
           for(Cookie c:cookies)
           {
              if(c.getName().equals("username"))
              {
                   username =  URLDecoder.decode(c.getValue(),"utf-8");
              }
              if(c.getName().equals("password"))
              {
                   password =  URLDecoder.decode(c.getValue(),"utf-8");
              }
           }
      }
    %>
    <form name="loginForm" action="dologin.jsp" method="post">
       <table>
         <tr>
           <td>用户名:</td>
           <td><input type="text" name="username" value="<%=username %>"/></td>
         </tr>
         <tr>
           <td>密码:</td>
           <td><input type="password" name="password" value="<%=password %>" /></td>
         </tr>
         <tr>
           <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td>
         </tr>
         <tr>
           <td colspan="2" align="center"><input type="submit" value="登录"/><input type="reset" value="取消"/></td>
         </tr>
       </table>
    </form>
  </body>

 

 

doLogin.jsp

  <body>
    <h1>登录成功</h1>
    <hr>
    <br>
    <br>
    <br>
    <% 
       request.setCharacterEncoding("utf-8");
       //首先判断用户是否选择了记住登录状态
       String[] isUseCookies = request.getParameterValues("isUseCookie");
       if(isUseCookies!=null&&isUseCookies.length>0)
       {
          //把用户名和密码保存在Cookie对象里面
          String username = URLEncoder.encode(request.getParameter("username"),"utf-8");
          //使用URLEncoder解决无法在Cookie当中保存中文字符串问题
          String password = URLEncoder.encode(request.getParameter("password"),"utf-8");
          
          Cookie usernameCookie = new Cookie("username",username);
          Cookie passwordCookie = new Cookie("password",password);
          usernameCookie.setMaxAge(864000);
          passwordCookie.setMaxAge(864000);//设置最大生存期限为10天
          response.addCookie(usernameCookie);
          response.addCookie(passwordCookie);
       }
       else
       {
          Cookie[] cookies = request.getCookies();
          if(cookies!=null&&cookies.length>0)
          {
             for(Cookie c:cookies)
             {
                if(c.getName().equals("username")||c.getName().equals("password"))
                {
                    c.setMaxAge(0); //设置Cookie失效
                    response.addCookie(c); //重新保存。
                }
             }
          }
       }
    %>
    <a href="users.jsp" target="_blank">查看用户信息</a>
    
  </body>

user.jsp

  <body>
    <h1>用户信息</h1>
    <hr>
    <% 
      request.setCharacterEncoding("utf-8");
      String username="";
      String password = "";
      Cookie[] cookies = request.getCookies();
      if(cookies!=null&&cookies.length>0)
      {
           for(Cookie c:cookies)
           {
              if(c.getName().equals("username"))
              {
                   username = URLDecoder.decode(c.getValue(),"utf-8");
              }
              if(c.getName().equals("password"))
              {
                   password = URLDecoder.decode(c.getValue(),"utf-8");
              }
           }
      }
    %>
    <BR>
    <BR>
    <BR>
         用户名:<%=username %><br>
         密码:<%=password %><br>
  </body>

 

几个注意的点:

  1. response.addCookie(key,value);//将Cookie添加到客户端中
  2. request.setCharacterEncoding("utf-8");//设置编码格式为utf-8
  3. URLEncoder.encode(request.getParameter("username"),"utf-8");//可以防止中文乱码

 

这时候可以测试,把所有浏览器关掉再去打开doLogin页面发现username还是可以获取到,这样就可以说名是Cookie保存了用户名信息,而不是session(在session中,关闭浏览器,则会话结束,所有信息就丢失了。)

Session和Cookie的区别

Cookie的使用,及与Session对比

 

浏览记录,访问习惯,兴趣等适合保存在cookie中,也就是客户端中,而session中保存的是一些重要信息。session的安全性比cookie要高。