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);                       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.cn.servlet04; 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.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; @WebServlet("/Cookie03") public class ServleCookie03 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应消息体的数据格式 resp.setContentType("text/html;char=utf-8"); //获取cookie Cookie[] cookies = req.getCookies(); //遍历数据 if(cookies != null && cookies.length>0){ for(Cookie c:cookies){ String name = c.getName(); //判断name是否是登录时间的name System.out.println("name"+name); if("time".equals(name)){ String value = c.getValue(); //解码 value = URLDecoder.decode(value,"utf-8"); //有我要的cookie 不是第一次访问 resp.getWriter().write("<h1>欢迎回来</h1>"); } } } if(cookies == null || cookies.length==0){ //第一次访问 Date date = new Date();//获取系统时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String str_date = sdf.format(date); Cookie c = new Cookie("time",str_date); // c.setMaxAge(0); resp.addCookie(c); resp.getWriter().write("欢迎你首次访问"); } } } 为什么网页无法正常显示,给出修改过后的代码
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值