Cookie知识点

一、会话跟踪技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束,在一次会话中可以包含多次请求和响应,会话是跟浏览器绑定起来的同一个浏览器在不关闭的前提下发送了多次请求访问了服务器,这些请求之间称为同一次会话

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

问题提出:

但是因为Http协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,所以服务器不知道该请求是否来自于同一浏览器,服务器不知道那就意味着数据共享共享不了了。如果http协议是有状态的,那意味着在同一次会话中,下一次的请求将要带上上一次请求所有的数据,这样就会导致后边的请求数据体量很大而请求速度变慢,http协议把每一次请求设置为独立的,这样后边的请求就不会受到影响,但是就是因为这个独立性,从而导致服务器不能识别每次请求的关联关系,为了解决这个问题就需要用到会话跟踪技术了。

问题解决方法:

1.客户端会话跟踪技术:Cookie

2.服务端会话跟踪技术:Session

二、Cookie

1、Cookie工作原理

客户端会话技术,将数据保存到客户端,以后每次请求数据都携带Cookie数据进行访问

打个比方:同一个浏览器对服务器发送了两次请求12,去请求服务器里的servletA和B,当浏览器发送了请求1去请求服务器里的servletA时,servletA会创建一个cookie对象的数据,当servletA真正做响应的时候又把cookie发送给了客户端浏览器,这时浏览器接收到了cookie的数据并保存到内存里,然后浏览器在同一次会话中发送2请求去请求servletB时,这个时候这个浏览器就会携带者cookie访问servletB,在servletB中我们就可以把cookie携带的数据获取到

Cookie原理:Cookie的实现是基于Http协议的,这里面会涉及到两个头,一个是响应头set-cookie请求头cookie  当tomcat发现发送的数据是一个cookie时,它会在数据里面加上一个响应头set-cookie,响应头对应的值就是你设置的键值对如:(username=badou),浏览器接收到响应头之后,发现是cookie后,浏览器就把set-cookie响应头解析了,解析了之后就拿到了对应的数据(如:username=badou),拿到之后就把数据保存到了内存里面(关闭浏览器cookie就没了)。当浏览器在同一次会话中访问另一个servletB时,它会自动的用一个请求头cookie携带cookie访问,servletB获取到对应的请求头的数据之后通过request对象把所有的数据封装成对应的cookie对象来获取出来。

Cookie的存活时间:默认情况下cookie存储在浏览器的内存中,当浏览器关闭内存释放,则cookie被销毁。如果需要让它持久化可以用setMaxAge(int seconds)设置cookie存活时间

其中正数:将cookie写入浏览器所在电脑的硬盘,持久化存储,到时间自动删除

负数:默认值,cookie在当前浏览器内存中,当浏览器关闭,cookie销毁

零:删除对应cookie

 

Cookie存储中文方法:cookie不能直接存中文,如果要存中文那就要把中文的数据转码转成非中文的数据,存完后再解析成中文数据,可用URL编码

用URLEncoder可以转码,用URLDecoder可以解码

  String value = "巴豆";
        //转码并重新赋值
       value = URLEncoder.encode(value,"UTF-8");
        Cookie cookie = new Cookie("username",value);

 

//解码并重新赋值  
value = URLDecoder.decode(value);

2、如何使用Cookie

①发送cookie

第一步创建cookie对象,设置数据

   Cookie cookie = new Cookie("name","badou");

第二步发送cookie

  response.addCookie(cookie);

查询结果可以在浏览器里的设置里看到cookie发送内容

②获取cookie

第一步调用request方法里的getCookies()方法获取cookie,(在浏览器访问当前ocalhost服务器资源的时候,它会把当前localhost下所有的cookie都携带过去,所以我们只能一次性的把所有cookie全部获取出来返回一个cookie数组)

 Cookie[] cookies = request.getCookies();

 第二步遍历数组,加一个if判断是不是我要所需要的cookie,并使用cookie对象方法获取数据

 for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if ("username".equals(name)) {
                //获取数据
                String value = cookie.getValue();
                System.out.println(name + ":" + value);
                break;

            }
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值