会话技术_Cookie学习总结

1.会话技术_概述
一次会话什么时候开始?什么时候结束?
开始:
浏览器第一次给服务器发送请求;
结束:
浏览器或服务器有任意一方断开;

会话技术能干什么?
	前提:
		http是基于请求和响应模型的协议;
		它的多次请求之间是相互独立的(http是无状态的协议)
		
	一次会话中多个请求之间共享数据;

	
会话技术分类?
	客户端会话:
		Cookie
	服务器端会话:
		Session

2.会话技术_Cookie_快速入门
Cookie会话技术把要共享的数据存储在哪里了?
存储在浏览器;

Cookie的使用步骤?
	给浏览器响应Cookie:
		1.创建Cookie对象:
			new Cookie(String key,String value);
		2.通过reponse把cookie响应给浏览器;
			addCookie(Cookie cookie)
	读取浏览器携带的Cookie:
		Cookie[] request.getCookies();
		遍历数组;

************************
	会话技术共享数据的范围:
		一次会话的多个请求间共享

3.会话技术_Cookie_原理分析
服务端发送Cookie到浏览器,本质上做了什么?
设置一个响应头:
Set-Cookie:msg=hello
浏览携带Cookie信息到服务器,本质上做了什么?
设置一个请求头:
Cookie:msg=hello;

4.会话技术_Cookie_细节1_发送多个Cookie
响应多个Cookie,本质是做了什么?
使用多个Set-Cookie响应头完成;
浏览器请求的时候,怎么把多个cookie带给服务器?
使用一个Cookie请求头完成:多个键值对之间用;分割;
Cookie:
msg=I%27m+cookie; love=java; Idea-e5a21e0e=07905766-0afa-4047-b180-92bd67dba78a; _ga=GA1.1.54508718.1572591409
***************
如果服务器响应多个cookie,键名相同,那么后面的值会覆盖前面的值

5.会话技术_Cookie_细节2_Cookie存活时间
默认情况下,浏览器怎么存储Cookie?
默认存储到内存中!!
如何指定Cookie的存活时间?
setMaxAge(int 时间);
正数;
告诉浏览器把cookie信息存储到文件中,并且指定过期时间
0;
告诉浏览器,把Cookie信息删除掉
负数:
默认值

6.会话技术_Cookie_细节3_Cookie存储中文
Tomcat8能不能直接存储中文?
能!!!!

// 设置响应字符格式
response.setContentType(“text/html;charset=utf-8”);
System.out.println(“cookieDemo1…”);
// 获取cookie
Cookie cookie = new Cookie(“msg”,“I’m cookie”);
// 给cookie 进行编码
String encode = URLEncoder.encode(cookie.getValue(), “utf-8”);
// 将编码后的值重新赋值给cookie
cookie.setValue(encode);
// 把cookie响应给浏览器
response.addCookie(cookie);

7.会话技术_Cookie_细节4_Cookie共享(了解)
默认情况下,Cookie能不能在多个Web项目中共享?
不能
如何设置同一服务器上多个项目之间Cookie共享?
setPath(String path);

	默认情况下,cookie的访问路径为:  /虚拟目录   
		那么,访问/虚拟目录及该目录的子目录,都可以携带cookie
	
	setPath("/")
	
如何设置不同服务器上Cookie共享?
	setDomain(String domain);
	setDomain("域名")
		该域名及该域名下的子域名都可以共享这个cookie

8.会话技术_Cookie_特点&作用
cookie的大小和个数有没有限制?
有;
Cookie不安全;

9.会话技术_Cookie_案例_分析
1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
在这里插入图片描述
10会话技术_Cookie_案例_代码实现
Cookie里面能不能有空格?如何处理?
不能有空格等特殊字符;
解决方案:
URLEncoder.encode(cookie.getValue(), “utf-8”);
URLDecoder.decode(cookie.getValue(), “utf-8”);

package live.longmarch.web;

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;

/*
   1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
   2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
 */
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置从数据库以及浏览器请求拿到数据的编码格式 设置对客户端请求和数据库取值时的编码
        request.setCharacterEncoding("utf-8");
        // 指定服务器给浏览器响应数据的编码格式,要求浏览器按照指定格式进行编码
        response.setContentType("text/html;charset=utf-8");
        // 获取所有的cookie 逐个遍历cookie
        Cookie[] cookies = request.getCookies();
        // 设置一个flag ,false为没有访问过
        boolean flag = false;
        // 对cookie数组进行非空判断
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                // 如果fistCookie 等于cookie的名字,证明不是首次访问。
                if ("fistCookie".equals(cookie.getName())) {
                    // 设置flag
                    flag = true;
                    // 获取之前的cookie数据,拿到上次访问的时间
                    // 获取前需要进行解码
                    String value = cookie.getValue();
                    value = URLDecoder.decode(value, "utf-8");
                    // 显示欢迎回来字符串,
                    response.getWriter().write("欢迎回来,你上次的访问时间是: " + value);

                    // 因为时间里面有空格,所以需要设置cookie ,将cookie中的值进行编码
                    // 获取当前时间,便于下次访问

                    value = URLEncoder.encode(getTime(), "utf-8");
                    cookie.setValue(value);
                    //设置cookie的存活时间
//                    cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                 //   cookie.setMaxAge(0);
                    response.addCookie(cookie);



                    break;
                }

            }
        }

        // 如果flag = false 则证明没有访问过,为第一次访问
        if (flag == false){
            // 存储当前时间
            // 打印欢迎字符串
            response.getWriter().write("你好,欢迎您来到longmarch");

            // 存储前进行编码,
            String encode = URLEncoder.encode(getTime(), "utf-8");
            // 添加cookie信息 ,名字为:fistCookie
            Cookie cookie = new Cookie("fistCookie",encode);
            response.addCookie(cookie);

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static String getTime() {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
        String format = sdf.format(date);
        return format;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值