Java web cookie

瘦欲@ 提交于 2019-11-29 17:19:31

         设置\获取cookie                        cookie存活时间                cookie共享问题

1.Cookie的特点和作用

   1. cookie一般用于存出少量的不太敏感的数据        2. 在不登录的情况下,完成服务器对客户端的身份识别

   3. cookie存储数据在客户端浏览器

   5. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)     

设置\获取cookie

        1. 创建Cookie对象,绑定数据             new Cookie(String name, String value) 
         2. 发送Cookie对象                                response.addCookie(Cookie cookie) 

Cookie c = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","zhangsan");
response.addCookie(c);
response.addCookie(c2);

         3. 获取Cookie,拿到数据      Cookie[]  request.getCookies()      返回的是一个 Cookie 对象数组

     String name = c.getName();    获取键             String value = c.getValue();   设置值如果键一样会覆盖原来的

        Cookie[] cs = request.getCookies();
        if(cs != null){
            for (Cookie c : cs) {
                String name = c.getName();             获取键
                String value = c.getValue();          获取值
                System.out.println(name+":"+value);}}

3. 实现原理    基于响应头set-cookie和请求头cookie实现

cookie存活时间

     1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
     2. 持久化存储:  void  setMaxAge(  int  seconds )
                    1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
                    2. 负数:默认值             3. 零:删除cookie信息

         Cookie c1 = new Cookie("msg","setMaxAge");
        //c1.setMaxAge(30);   将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(-1);   默认关闭浏览器消失
        c1.setMaxAge(0);      相当于删除Cookie
        response.addCookie(c1);

    3. cookie能不能存中文?
         1. 在tomcat 8 之前 cookie中不能直接存储中文数据。 需要将中文数据转码---一般采用URL编码(%E3)
         2.在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析

String encode = URLEncoder.encode(str_time,"utf-8");
String decode = URLDecoder.decode(value, "utf-8");

cookie共享问题

  1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
       1.默认情况下cookie不能共享

           setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
            如果要同一个服务器 不同的 项目  共享,则可以将path设置为"/"
       2. 不同的tomcat服务器间cookie共享问题?
            setDomain(String path):   如果设置一级域名相同,那么多个服务器之间cookie可以共享
            setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

        Cookie c1 = new Cookie("msg","你好");
        c1.setPath("/");           设置path,让当前服务器下部署的所有项目共享Cookie信息
        response.addCookie(c1);

Jsp

1. 概念:
     1.Java Server Pages: java服务器端页面
         可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码 用于简化书写!!!

     2. 原理   JSP本质上就是一个Servlet   底层将 jsp文件编译为一个 Httpservlet的.java  再编译为 .class 文件  

  2. JSP的脚本:JSP定义Java代码的方式
        1. <%  代码 %>:在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
        2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
       3. <%= 代码 %>: 输出语句中可以定义什么,该脚本中就可以定义什么。  相当于可以输出变量

 3.注意 :  响应编码可以由jsp脚本指定       

 4. JSP的内置对象:
      1.在jsp页面中不需要获取和创建,可以直接使用的对象     jsp一共有9个内置对象。
          request         response.....
      2. out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
           response.getWriter()和out.write()的区别:        response.getWriter()数据输出永远在out.write()之前
           在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。

改造cookie案列

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>home</title>
</head>
<body>
<%
    Cookie[] cookies = request.getCookies();
    boolean flag = false;
    if (cookies != null || cookies.length > 0) {
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if ("lastime".equals(name)) {
                flag = true;
                Date date = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String str_time = sdf.format(date);
                String encode = URLEncoder.encode(str_time, "utf-8");
                cookie.setValue(encode);
                cookie.setMaxAge(60 * 60 * 24 * 30);
                response.addCookie(cookie);
                String value = cookie.getValue();
                String decode = URLDecoder.decode(value, "utf-8");

                %>
<h1 style="color: blue">欢迎回来,您上一次访问时间为:<%=decode%></h1>
<%
            }
        }}
    if (cookies == null || cookies.length == 0 || flag == false) {

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String str_time = sdf.format(date);
        String encode = URLEncoder.encode(str_time, "utf-8");
        Cookie cookie = new Cookie("lastime", encode);
        cookie.setMaxAge(60 * 60 * 24 * 30);
        response.addCookie(cookie);

        %>
<h1 style="color: chocolate">欢迎您首次访问!</h1>
<%
    }
%>
</body>
</html>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!