Cookie学习

1、cookie的作用

我们在浏览器中登录某个网站,比如你在登录一些网站的时候,你会发现你输入密码的时候,发现有记住密码的这个选项,当你在下次登录的时候,你会发现自己的账号已经自动登录了,但有的时候时间久了,你会发现又要让我们重新登录一边,那他的信息是怎么记录的呢。这里就用到了cookie的技术。我们为什么要用到cookie呢,因为HTTP协议是无状态的协议,当客户端与服务端数据交互完成时,链接就会关闭,每次交互数据都需要建立新的链接。有的时候这是很麻烦的,所以cookie就来帮我们解决这些问题。cookie由HTTP服务器设置,保存到我们的浏览器中。这样我们就不必每次访问一个链接时,都要输入密码了,但是cookie是有时间限制的超出设定的时间,就会被清除。

2、保存会话数据的两种技术.

什么是会话?会话可以简单的理解为:用户开一个浏览器,点击多个链接,访问服务器的多个web资源,然后关闭浏览器,整个过程称之为一次会话。

2.1 cookie

   cookie是一种客户端的技术,程序把每个用户的数据以cookie的形式写给各自的浏览器。当用户使用浏览器再去访问服务器的web资源时,就会带着各自的数据去。(例如,我们的账号与密码),这样web资源处理的就是用户各自的数据了。(你的浏览器密码,不会被别人的浏览器使用)

2.2session

  session服务端的技术,利用这个技术,服务器在运行时可以为每一个用户创建一个其独有的session对象,这样用户可以把自己的数据存储到自己的session对象中,当用户再去访问该服务器的其它web资源时,其它web资源就可以从用户的独有的session取出必要的数据来为用户服务。

3、Java中提供的操作cookie的API

常用方法
Cookie(java.lang.String name,java.lang.String value)构造函数创建一个cookie的对像,并传入cookie的名称,和cookie的值
getName()java.lang.String返回cookie的名称
getValue()java.lang.String返回cookie的值
getVersion()int返回此cookie遵守的协议版本
setMaxAge(int expiry)void

设置cookie的最大保存时间,如果服务端没有设置的话,那么这个cookie仅在一次会话有效。当浏览器关闭的时候,就失效了。假如我们设置了30分钟,那么该cookie会在我们的硬盘上保存30分钟,30分钟之后,就会失效。

为什么可以做到呢?

因为我们的浏览器就是一个软件,服务器回送的数据存储在浏览器的缓存中,当浏览器关闭时,如果没有设置时间的话,那么缓存会被清理,所以cokie就失效了。

getMaxAge()int返回该cookie的保存时间
setPath(String uri)void设置cookie的有效路径,(有效路径?假如我i们设置的有效路径为/luther那么当浏览器访问/luther下的web资源时,才会带上cookie一起访问)
getPath()String返回有效路径
setDomain(String pattern)void设置cookie有效域,参数必须以.开始
getDomain()void获取cookie的有效域

tips:关于有效域和有效路径,可以参考这篇文章https://blog.csdn.net/wang379275614/article/details/53333054

4、cookie的使用范例:

4.1 cookie记录上一次访问的时间

package com.luther.TestWeb;

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 TestCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out=resp.getWriter();
        Cookie cookies[]=req.getCookies();
        for(Cookie c:cookies){
            System.out.println(c.getName());
        }
        if(cookies!=null){
            for(int i=0;i<cookies.length;i++){
                Cookie cook=cookies[i];
                if(cook.getName().equalsIgnoreCase("lastAccessTime")){

                   Long time=Long.parseLong(cook.getValue());
                   Date date=new Date(time);//生成日期对象
                  out.println("你上一次最后来的时间是:"+date.toLocaleString());//日期格式


                }
            }
        } else{
            out.write("这是你第一次来");

        }
        Cookie cookie1=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
        resp.addCookie(cookie1);
        out.flush();
        out.close();

    }

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

上面的没有设置cookie的有效期,所以当我们关闭浏览器的时候,cookie就会被清理.

Cookie cookie1=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
 //一天,秒为单位
cookie1.setMaxAge(24*60*60);
resp.addCookie(cookie1);

tips:cookie的注意细节:

   一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。(上面的for each可以看出来)

   一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

   如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
 

4.2删除cookie

package com.luther.TestWeb;

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;
import java.io.PrintWriter;


@WebServlet("/recookie")
public class RemoveCookie extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //创建一个名称为lastAcessTime的cookie
        Cookie cookie=new Cookie("lastAcess",System.currentTimeMillis()+"");
        //删除该cookie
        cookie.setMaxAge(0);
        Cookie[] cookies = req.getCookies();
        resp.addCookie(cookie);
    }
}

4.3 cookie中存取中文.

如果要在cookie中存取中文的话,那么必须使用URLEncoder类里的encode(String name,String codingFormat)来对中文进行编码。

Cookie cookie=new Cookie("country", URLEncoder.encode("中国","utf-8"));

同样我们如果需要在cookie中读取中文的话,那么需要用对应的码表来进行解码,使用URLDecoder类中的decode(String value,String codingFormat);来进行解码。

  out.write(cookie2.getName()+"  ..."+URLDecoder.decode( cookie2.getValue(),"utf-8"));

5、cookie的一些注意点

--服务器可以向客户端写内容,只能是文本内容。(不能写其他的文件,否则会不安全)

--客户端可以阻止服务器端写入。

--服务器端只能拿自己webapp写入的的东西。(不可跨域名google只能拿google的东西) 

--cookie就是服务器端写入客户端的这些个小文本的信息。Cookie以“键-值”对的形式保存数据。

--登陆后(设置的时间)不用再登陆。就是服务器把信息保存在了客户端的cookie里面了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值