会话技术Cookie

会话技术Cookie

一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,

例如,一个用户在某网站上的整个购物过程就是一个会话。
为了保存会话过程中产生的数据

在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

Cookie是客户端会话对象,
Cookie存储在客户端,它的数据往返于客户端和服务器.

Cookie运行原理:
服务器产生数据,客户端存储数据,每次请求服务器都会携带 cookie到服务器

Cookie特点
1.存储键值对数据,且//一个cookie只能存储一对key和value

2.只能存储String类型的数据

3.服务器通过响应头传递cookie给浏览器 

4.cookie是存储在客户端浏览器的文本小文件,
每个cookie大小不超过 4K

5.如果cookie没有设置有效期,默认的有效期就是浏览器关闭,默认也不会产生缓存的文件(储存的文本文件).
如果设置了有效期,才会储存文本小文件。

6.客户端存在cookie数据,浏览器每次请求都会携带路径符合的cookie给服务器端

cookie的应用场景

  1. 记住用户名

  2. 自动登录(记住用户名和密码)

cookie的基本使用

Cookie:
new Cookie(String name, String value) 创建cookie对象

String getName() 获取cookie的名称

String getValue() 获取cookie的值

void setPath(String uri) 
设置cookie的路径——浏览器根据这个路径判断那些cookie要发送给服务器

HttpServletResponse:
void addCookie(Cookie cookie) 将cookie发送给浏览器

HttpServletRequest:
Cookie[] getCookies() 获取浏览器发送的cookie

创建cookie和设置cookie

//创建cookie
Cookie cookie = new Cookie("name","admin");

//cookie需要设置有效期,才会在客户端存储文本文件,
//如果不设置有效期,cookie的数据只存在浏览器内存中
cookie.setMaxAge(60*60*24*7);//单位,秒,7天有效期

//设置有效路径(浏览器就访问有效路径开头的资源才会携带cookie)
cookie.setPath(request.getContextPath()+"/GetCookieDataServlet");
//这个路径是给浏览器使用,格式/工程名字/资源路径

//只有浏览访问/demo/GetCookieDataServlet为开头才会携带cookie到服务器
///demo/GetCookieDataServlet/demo,会携带
///demo/GetCookieDataServletDemo,不会携带
//request.getContextPath()="/demo"
//cookie如果不设置有效路径,会采用默认当前工程名字,
//只要以工程名字开头访问的资源都会携带cookie.
//将cookie的数据给到浏览器去存储
response.addCookie(cookie);

读取cookie

//读取cookie的数据
//一个键值对是一个cookie,多个键值对就是多个cookie
Cookie[] cookies= request.getCookies();

//判断数组有效性
if(cookies!=null && cookies.length>0){

    //来到这里,才说明浏览器传递cookie过来了
    //读取cookie里面存储的name值,需要遍历查找name
    for(Cookie cookie : cookies){
        if("name".equals(cookie.getName())){
            //直接获取cookie的值,不需要参数的
            String value = cookie.getValue();

            response.getWriter().write("name="+value);
        }
    }

删除cookie

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

void setPath(String uri) 设置cookie的路径——浏览器根据这个路径判断那些cookie要发送给服务器

注意事项
1. cookie的生存时间单位为:秒
2. 要删除已经存在的cookie,只需要创建一个一模一样的cookie覆盖已有cookie,
新创建的cookie必须名称和路径与原来的cookie一致,value清空和有效期设置为0

使用步骤

1. 创建cookie对象

2. 设置生存时间

3. 设置cookie的路径

4. 发送cookie给浏览器
//=====如果需要立刻删除cookie======
//创建空数据的cookie,名称保持一致
Cookie cookie = new Cookie("name","");

//设置cookie的生存时间为0立刻死亡
cookie.setMaxAge(0);

//设置cookie的路径,与原来的cookie路径保持一致
cookie.setPath("/demo");

//发送cookie给浏览器
response.addCookie(cookie);

记录用户上一次访问时间

//第一次访问操作
// 1 获取用户当前访问的时间
Date date = new Date();

//格式化时间数据
//通过响应头传递数据给浏览器,响应头不能传递特殊字符,空格,; ,
//(注意:在cookie值中不能使用分号(;)、逗号(,)、等号(=)以及空格,否则会出现异常)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd/hh:mm:ss");
String format1 = format.format(date);

System.out.println(format1);

// 2 将数据存入cookie
Cookie cookie = new Cookie("time", format1);
cookie.setMaxAge(60*60*24);

// 3 将数据发送给浏览器
response.addCookie(cookie);

//第二次访问操作
//获取cookie数组
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie2 : cookies) {

        //选择获取名称为time的cookie
        if("time".equals(cookie2.getName())) {

            //将数据发送页面
            response.getWriter().write(cookie2.getValue());
        }
    }
}
cookie是通过响应头传递给客户端,通过请求头传递给服务器端,
请求头与响应头默认能传输中文,如果传输中文必须要URL编码和URL解码.
解码格式: URLDecoder.decode(“需要解码的内容”,”指定码表”);
编码格式: URLDecoder.encode(“需要解码的内容”,”指定码表”);

如果我们一定要保存非法数据在cookie中,该如何操作呢?

答:cookie对于基本符号、数字、和字母是可以存储的,

因此,我们只需要将非法数据转换成符号、数字、和字母形式存储,

要使用的时候再转换成正常的中文(解码)即可。

如何对中文数据进行编码和解码

URLEncoder类:
static String encode(String s, String enc) 将指定的字符串,按指定的编码表编码

URLDecoder类:
static String decode(String s, String enc) 将指定的字符串,按指定的编码表解码

// 编码解码两次操作要使用同一个编码表

使用步骤

1. 在创建cookie之前将数据编码
2. 将编码后的数据存入cookie
3. 获取到cookie之后,解码数据,获取正常中文内容
//第一次访问操作
// 1 获取用户当前访问的时间
Date date = new Date();

// 2 格式化时间数据(时间转换成含有非法字符形式)
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 ;,= hh时mm分ss秒");
String format1 = format.format(date);
System.out.println(format1);

//由于cookie是通过响应头传递数据给浏览,
//响应头不能直接传递中文,需要手动url编码
// 3 将数据进行编码
String encode = URLEncoder.encode(format1, "utf-8");

// 4 将数据存入cookie
Cookie cookie = new Cookie("time",encode );
cookie.setMaxAge(60*60*24);

// 5 将数据发送给浏览器
response.addCookie(cookie);

//第二次访问操作
//获取cookie数组
Cookie[] cookies = request.getCookies();
if(cookies != null) {
    for (Cookie cookie2 : cookies) {

        //选择获取名称为time的cookie
        if("time".equals(cookie2.getName())) {

            //由于存的时候是url编码数据,读取需要进行url解码
            String decode = URLDecoder.decode(cookie2.getValue(), "utf-8");

            //将数据发送页面
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(decode);
        }
    }
}
服务器端生成cookie数据,通过响应头传递给浏览器,在浏览器端存储的文本文件。
浏览器每次请求都会携带与cookie有效路径开头的的cookie数据通过请求头带到服务器端。

cookie存储在客户端,数据是不安全的,

对于敏感数据要进行加密后在存储,每个cookie大小有限制4KB.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值