04.Cookie

前言

HTTP协议是无状态协议,无状态就是每次发起的请求都是毫无关系的,没有任何的关联,这使得我们想要在每个请求或整个会话之间共享数据比较困难。所以就产生了会话技术Session 和 Cookie。

什么是会话

浏览器和服务器之间发生的一系列请求和响应的过程,通俗一点来说,就是从你开始访问一个网站,到你结束这个网站的访问,中间所有的请求与服务器的交流都可称作是一个会话。
你可以将数据放入session或cookie,以达到整个会话过程中数据共享。

Cookie的概述

Cookie就是保存在浏览器端的键值对数据,它的存活时间有限,不能识别一些特殊符号。

Cookie的创建

每个Cookie是以键区分的,如果设置同样键的Cookie,后面Cookie的值会覆盖前面的。

//cookie的创建
Cookie cookie = new Cookie("name","lglg");
//让response返回给浏览器保存
response..addCookie(cookie);

Cookie的获取

Request对象没有提供根据cookie的键获取cookie值的api。只能先通过获取cookie数组,然后迭代找到自己想要的Cookie.

Cookie[] getCookies() request获取浏览器发送的cookie  
String getName()获取cookie的名称
String getValue() 获取cookie的值
-------------------------------------------
Cookie[] cookies = request.getCookies();
 //循环所有的cookie
for(Cookie cookie:cookies){
    
    
    System.out.println(cookie.getName()+" "+cookie.getValue());
}

Cookie有效期的设置

void setMaxAge(int expiry) 可以设置cookie的最大生存时间(单位:秒)

cookie.setMaxAge(0);//删除cookie
cookie.setMaxAge(-1);//有效期为当前会话
cookie.setMaxAge(60*60);//过期时间为1小时

Cookie的访问路径

每次http请求会将符合该次路径请求的cookie携带上,所以设置cookie的访问路径非常重要,默认是本项目产生的cookie,只会访问本项目的请求携带上。

//方式1:/myweb/      当访问项目下的所有资源,请求都会携带Cookie
//方式2:/myweb/abc   当访问项目下的abc下所有资源,请求都会携带Cookie
//方式3:/            当访问服务器中所有资源,请求都会携带Cookie
//默认方式:/myweb/   当访问项目下的所有资源,请求都会携带Cookie
cookie.setPath(String uri)	
设置cookie的路径——浏览器根据这个路径判断那些cookie要发送给服务器。

Cookie的删除

Cookie没有直接的删除方法,只能通过设置一些其他属性等效于删除的效果

//1.修改Cookie的存活时间为0
cookie.setMaxAge(0);
//2.可以使用空值覆盖原值
Cookie cookie = new Cookie("name","");

Cookie的编码

Cookie不能识别一些特殊符号,在gerCookies()的时候会出现数据丢失的情况,这些特殊字符有:空格,方括号,圆括号,等于号,逗号,双引号,斜杠,问号,@符号,冒号,分号等。对于这些数据需要先将他们进行URLEncoder编码,然后再解码。

编码:  URLEncoder.encode(date, "UTF-8")
解码: URLDecoder.decode(date, "UTF-8")
----------------------------------------
String data = "@张三";
Cookie  cookie=  new Cookie("name",URLEncoder.encode(date, "UTF-8"));
response.addCookie(cookie);
-----------------------------
Cookie[] cookies = request.getCookies();//
        if(cookies != null){
    
    
            //循环所有的cookie
            for(Cookie cookie:cookies){
    
    
                if("name".equals(cookie.getName())){
    
    
                //解码
                	String vaule = URLDecoder.decode(cookie.getValue(),"utf-8");
				}
            }
        }else{
    
    
            System.out.println("没有查询到cookie");
        }

Cookie的域名与安全

Cookie不可跨域名,不同域名间不能使用同一个Cookie,如两个二级域名:www.hello.com和editor.hello.com。两者之间不能使用同一Cookie,要想使用需要使用setDomain()方法

//setDomain(String domain)
Cookie cookie = new Cookie("name","zhangsan");
cookie.setDomain(".hello.com");
cookie.setPath("/"); 
response.addCookie(cookie); 

Cookie同样也是不安全的,可以使用Cookie的setSecure方法,浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。

Cookie cookie = new Cookie("name", "zhagnsan"); 
cookie.setSecure(true);                         
response.addCookie(cookie);                       

猜你喜欢

转载自blog.csdn.net/lglglglglgui/article/details/108541849
04