• 会话技术------客户端技术cookie


    会话:

      客户端和服务器之间从建立连接到一方断开之间的多次请求和响应。

    会话技术包括:

    • 客户端会话技术 cookie
    • 服务端会话技术 session

    本篇讲解客户端会话技术。

    cookie 对象在服务器端创建,然后通过响应对象发送给客户端(浏览器),并保存在客户端浏览器中,默认是浏览器关闭时cookie自动删除。

    cookie简单代码实现:

    @WebServlet("/servletCookie")
    public class ServletCookie extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie cookie = new Cookie("name", "zhangsan");//设置cookie
            response.addCookie(cookie);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }
    @WebServlet("/servletCookieDemo2")
    public class ServletCookieDemo2 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie[] cookies = request.getCookies();
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name + "     " + value);
            }
    
    
        }
    
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

    下面讨论一下关于cookie的一些细节问题:

     

    • cookie的实现原理

    • cookie在浏览器中保存多长时间

    • cookie能不能存中文

    • cookie的共享范围

    • 浏览器对于cookie的大小和数量

    1.cookie的实现原理:

    但浏览器创建cookie对象并赋值响应给浏览器的时候会在响应头中会存在set-cookie:name=zhangsan(沿用上面代码的案例)的响应头,浏览器就收到这样的响应头就会在本地保存这个cookie,然后浏览器下次访问服务器的时候就会在请求头信息中存在:cookie:name=zhangsan的请求头信息,通过request对象的getCookies();方法可以获得cookie数组。图解如下:

     通过浏览器开发者工具对上述过程进行验证:

    访问ServletCookie的响应头中:

    访问ServletCookieDemo2:

    2.cookie在浏览器中保存多长时间:

      (1)默认情况下当浏览器关闭的时候cookie会被自动删除:

      (2)持久化存储在浏览器:通过cookie对象的方法setMaxAge(int Seconds);

        • 参数默认是-1:表示关闭浏览器是删除cookie
        • 参数为0:表示删除cookie
        • 参数为正整数: 表示在多少秒之后删除cookie

     代码演示:

    @WebServlet("/servletCookie")
    public class ServletCookie extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie c1 = new Cookie("name", "zhangsan");//设置cookie
            c1.setMaxAge(60*5);//保存5分钟后自动删除
            response.addCookie(c1);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

     

     访问 ServletCookie之后关闭浏览器

        

     当打开浏览器之后访问servletCookieDemo2依然会打印:

    3.cookie能不能存中文

    • tomCat8之前不能直接存中文(结局办法:使用URL编码)
    • tomCat8之后可以存中文(不包括特殊字符,比如空格)

    代码演示:

    @WebServlet("/servletCookie")
    public class ServletCookie extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie c1 = new Cookie("name", "张三");//设置cookie
            response.addCookie(c1);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

    访问资源类2正常打印:

    但是cooki的键还是不支持中文,会报错:

    @WebServlet("/servletCookie")
    public class ServletCookie extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie c1 = new Cookie("姓名", "张三");//设置键时中文
            response.addCookie(c1);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

    访问报错:

    解决办法一样是使用URL编码:

    传值钱使用URL编码

    @WebServlet("/servletCookie")
    public class ServletCookie extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String encode = URLEncoder.encode("姓名", "utf-8");   //编码
            Cookie c1 = new Cookie(encode, "张三");//设置键时中文
            response.addCookie(c1);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

    收值后使用URL解码

    @WebServlet("/servletCookieDemo2")
    public class ServletCookieDemo2 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie[] cookies = request.getCookies();
            if (cookies!=null){
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    String value = cookie.getValue();
                    name=URLDecoder.decode(name,"utf-8");    //解码
                    System.out.println(name + "     " + value);
                }
            }
    
    
    
        }
    
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }

    正常打印:

    4.cookie的共享范围:

      1.cookie的共享范围是默认是当前项目,我们可以通过cookie对象的setPath(String path);方法进行设置

    当设置"/"的时候是整个服务器共享。

      2. 不同服务器之间cookie能不能共享?

        可以共享但是要设置通过cookie对象的setDoMain(String path);的方法,如果path代表的是以及域名,那么不同服务器的一级域名相同的可以共享

          例如:百度贴吧和百度新闻之间的共享

    5.浏览器对于cookie的大小和数量

        一个cookie大小大约为4kb,同一域名下的cookie数量不得超过大约20个

    迎风少年
  • 相关阅读:
    有关Fragment的知识点
    DashPathEffect
    Android 自定义View
    Android Parcelable
    Android之Activity状态的保存和恢复
    Android WebView介绍
    了解Android的编译器
    WebView
    使用RichEdit程序无法启动
    WTL布局对话框 CDialogResize
  • 原文地址:https://www.cnblogs.com/ZYH-coder0927/p/13685574.html
Copyright © 2020-2023  润新知