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;
}
}