• Cookie


    1,会话

    会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭资源,这个过程称为会话

     Cookie作用

        

    因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

    在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

    Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

    Cookie缺陷:

    1. Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
    2. 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用超文本传输安全协定
    3. Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。[3]

    有状态会话:

      理解:

        Cookie:服务端给客户端的一个信件,客户端下次访问服务端带上信件就可以了

        Session:服务端登记你来过了,下次来时在服务端匹配session

      cookie和session的区别:

          1.Session比Cookie安全,

          2.Session是存储在服务器端的,Cookie是存储在客户端的

    1.2 保存会话的两种信息

      cookie

        客户端技术 (响应,请求)

      session

        服务器技术,利用这个技术,可以保存用户会话信息,可以把信息或者数据放在session中

      常见案例:网站登录之后,下次不用再登录,第二次访问就直接进入

    1.3 Cookie

      1.从请求中拿到cookie信息

      2.服务器响应给客户端cookie

      

     1. Cookie[] cookies = req.getCookies();//获得cookie方法
     2. cookie.getname();//获得cookie中的key
     3. cookie。getvalue();//获得cookie中的value
     4.new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie
     5.cookie.setMaxAge(24*60*60);设置有效期
     6.resp.addCookie(cookie);//响应给客户端cookie

    cookie:一般保存在本地的用户目录下appdata;

    一个网站cookie是否存在上限!

      一个Cookie只能保存一个信息

      一个web站点可以给浏览器发送多个cookie,最多存放cookie

      Cookie大小有限制4kb

      300个cookie浏览器上限

    删除Cookie:

      不设置有效期,关闭浏览器,自动失效;

      设置有效期时间 0 ;

    获取cookie

    package com.king.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    //保存用户上一次访问时间
    public class CookieDemo01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //服务器把客户端上一次访问的时间封装成一个cookie,下次来时,就可凭cookie。被服务端识别
    
            //解决中文乱码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    
    
            PrintWriter out = resp.getWriter();
    
            //cookie,服务器端从客户端获取
            Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可返回多个
    
            //判断cookie是否存在
            if(cookies!=null){
                //如果存在的操作
                out.write("你上一次访问的时间是:");
    
                for (Cookie cookie : cookies) {
                    //获取cookie的名字
                    if(cookie.getName().equals("lastLoginTime")){
                        //获取cookie中的值
                        long lastLoginTime = Long.parseLong(cookie.getValue());
                        Date date = new Date(lastLoginTime);
                        out.write(date.toLocaleString());
    
                    }
                }
    
                
    
            }else{
                out.write("这是您第一次访问本站");
            }
    
            //服务器给客户端响应一个cookie;
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
    
            //设置cookie有效期一天
            cookie.setMaxAge(24*60*60);
    
            resp.addCookie(cookie);
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }

    删除cookie

    package com.king.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    public class CookieDemo02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //服务器给客户端响应一个cookie;
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
    
            //设置cookie为0,立马过期
            cookie.setMaxAge(0);
    
            resp.addCookie(cookie);
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }

    web.xml

    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0"
             metadata-complete="true">
    
        <servlet>
            <servlet-name>CookieDemo01</servlet-name>
            <servlet-class>com.king.servlet.CookieDemo01</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>CookieDemo01</servlet-name>
            <url-pattern>/c1</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>CookieDemo02</servlet-name>
            <servlet-class>com.king.servlet.CookieDemo02</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>CookieDemo02</servlet-name>
            <url-pattern>/c2</url-pattern>
        </servlet-mapping>
    
    </web-app>

      

      

  • 相关阅读:
    精通搜索分析
    简析MonoTouch工作原理
    第二次结对编程作业
    第02组 团队Git现场编程实战
    第一次结对编程作业
    团队项目需求分析报告
    第一次个人编程作业
    软工第一次作业
    团队项目选题报告
    Rookey.Frame之数据库及缓存配置
  • 原文地址:https://www.cnblogs.com/CL-King/p/13772900.html
Copyright © 2020-2023  润新知