Cookie

会话技术:

首先在Http协议中,他们的关系是独立的,就是说,第一次发送和接收的东西与第二次发送和接受的东西是相互独立的,这样就不利于数据的共享,比如说我逛淘宝,我一次加入一个东西到购物车,这样我加入多个东西以后,我进行下单,希望是一起下单,而不是一个一个下单,如果用http就达不到这个要求,但是用会话技术就可以达到这个要求。
会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
功能:在一次会话的范围内的多次请求间,共享数据。
方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
Cookie:
概念:客户端会话技术,将数据保存到客户端。
大致执行流程如下所示:
在这里插入图片描述
请求给了数据,客户端中存下该数据,第二次请求,它又把该数据发给浏览器。
快速入门:
使用步骤:
1.创建Cookie对象,绑定数据
new Cookie(String name, String value)传入Cookie的名字和值。
2.发送Cookie对象
response中有一个addCookie(Cookie cookie)方法
3.获取Cookie,拿到数据
在request中有一个获得Cookies的方法
Cookie[] request.getCookies()
测试:先新建一个类
在这里插入图片描述
新建一个servlet
在这里插入图片描述
新建一个路径是/cookieDemo1HttpServlet的实现类代码如下:

package cn.sainan114.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * FileName: CookieDemo1
 *
 * @Author:luguobao Date: 19:33
 * Description:
 * History:
 * <author>   <time>   <version>   <desc>
 * 作者姓名    修改时间    版本号       描述
 */
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c = new Cookie("msg", "hello");
        //2.发送Cookie
        resp.addCookie(c);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

在这里浏览器去访问服务器对象,然后,服务器对象创建了cookie对象,并且返回给浏览器对象数据。然后,我们在创建一个HttpServlet的实现类,因为Cookie对象是第二次访问的时候还是会携带的。所以,我们在第二次访问的时候,接受所有的Cookie对象,并且将它打印出来。代码如下:

package cn.sainan114.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * FileName: CookieDemo1
 *
 * @Author:luguobao Date: 19:33
 * Description:
 * History:
 * <author>   <time>   <version>   <desc>
 * 作者姓名    修改时间    版本号       描述
 */
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //3.获取Cookie
        Cookie[] cs = req.getCookies();
        //遍历数据
        if(cs != null){
            for (Cookie c :
                    cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name + ":" + value);
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

经过访问:发现如下结果:
在这里插入图片描述
至少说明,我们自己的那个cookie是获取出来了。
实现原理
用图像进行表示:
在这里插入图片描述
原理分析:首先,客户端请求/CookieDemo1,然后服务器发送cookie给浏览器,上面会带有响应头set-cookie:msg=hello,客户端收到以后,将cookie的数据存下来,当第二次访问/CookieDemo2的时候,会在请求头上写着cookie:msg=hello。而因为响应头中没有发送cookie。所以,响应头中什么都没有。
测试:第一次访问:/CookieDemo1响应头里面有msg=hello
在这里插入图片描述
第二次访问/CookDemo2在这里插入图片描述
响应头里面什么都没有,请求头里面有msg=hello。
实现原理是基于响应头set-cookie和请求头cookie实现
cookie的细节:
1.一次可不可以发送多个cookie
可以
可以创建多个对象,使用resp调用多次addCookie方法发送cookie即可。
编写/cookieDemo3
在这里插入图片描述
先访问/cookieDemo3将cookie发送给浏览器,响应头如下:
在这里插入图片描述然后,在访问之前的/cookieDemo2将浏览器请求的cookie给显示出来。
可以得到如下结果。在这里插入图片描述
注意:只要访问/cookieDemo3过,不管以后访问谁都会带有请求头,只是访问/cookieDemo2的目的是,将里面的内容给打印出来。
2.cookie在浏览器中保存多长时间
1.默认情况下,当浏览器关闭后,Cookie数据被销毁(默认保存到浏览器内存中)
2.如果想cookie的信息持久化的存储下来,则需要存到硬盘中。
setMaxAge(int seconds)
1.正数:将Cookie数据写到硬盘文件中,持久化存储,正数也代表他的存活时间。假设传的是30,则30秒后,文件将自动清除掉。
在这里插入图片描述
2.负数:默认值
3.零:删除cookie信息
3.cookie能不能存中文
在tomcat8之前,cookie中不能直接存储中文数据
需要将中文数据转码 一般为url编码
在tomcat8之后,可以存储。
先访问/cookieDemo5,再访问/cookieDemo2可以得到如下结论
在这里插入图片描述
4.cookie获取范围有多大
获取范围:假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
假设一个项目有两个虚拟目录,/day15和/day16,假设day15目录下有发送了cookie对象,在/day15目录下肯定是可以获取到的,但是,在/day16下面能不能获取到呢?答案默认是不能的。
但是,它里面有一个方法:
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。比如上面的目录是setPath("/day15")
如果要共享,则可以将path设置为"/"
下面进行双项目的部署:先创建一个javaee的模块,改名称
在这里插入图片描述
在day15上改一下虚拟目录:
在这里插入图片描述
然后,再把day16也部署进来
在这里插入图片描述
在这里插入图片描述
最终结果如下:
在这里插入图片描述
此时,服务器一启动两个项目都会被部署。
在day15下写如下的类:
在这里插入图片描述
我先在day16下访问/cookieDemo5理论上,服务器会发送cookie对象给浏览器。
在这里插入图片描述
然后,我再访问cookieDemo看看req中有没有cookie数据,要是有的话,给他打印出来。结果如下:
在这里插入图片描述
没有 msg:你好 的数据。所以,可以证明在它只可以在一个虚拟路径下访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值