• Cookie的使用,及与Session对比


    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");//套一层URLDecoder是为了防止中文乱码
                  }
                  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
           {
              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要高。

  • 相关阅读:
    nodejs--模块化
    node-package.json 文件package-lock.json
    NPM
    REPL介绍
    nvm npm nrm 区别
    docker docker-compose安装
    微信小程序对接阿里云视频点播,备忘
    python requests包爬网页数据demo
    php redis扩展地址
    php7.2.4安装rabbitmq扩展的过程中错误处理
  • 原文地址:https://www.cnblogs.com/volvane/p/9294565.html
Copyright © 2020-2023  润新知