Cookie的使用,及与Session对比

2018-07-12 07:34:51来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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是以文本文件保存在客户端的信息,所以他的value值本质上是一个字符串类型的

小例子

 

 代码只贴出了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中保存的是一些重要信息。session的安全性比cookie要高。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JAVA版开源微信管家—JeeWx捷微3.2版本发布,支持微信公众号,微

下一篇:Java练习题