会话技术介绍
- 为什么?
- ServletRequest域对象共享范围太小了,ServletContext域对象共享范围太大了。
- 概述
- 指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏 览器(或者到了过期时间),会话结束。
- 作用
- 存储数据并实现共享
- 分类
- Cookie : 浏览器端会话技术
- Session : 服务器端会话技术
cookie概述
- 概述
- 它是客户端浏览器的缓存文件,里面记录了客户浏览器访问网站的一些内容。同时,也是 HTTP协议请求头(Cookie)和响应头(Set-Cookie)的一部分
- 作用
- 它可以保存客户浏览器访问网站的相关内容(需要客户端不禁用Cookie)。从而在每次访问 需要同一个内容时,先从本地缓存获取,使资源共享,提高效率。
- 常用属性
- name : cookie名称
- value : cookie值
- path : cookie访问路径
- maxAge : cookie存活时长
cookie的基本使用
- 需求
- ①创建Cookie对象
- ②将Cookie对象返回给浏览器并保存
- ③获取Cookie对象
- 代码实现
@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//①创建Cookie对象
String msg = "hello";
Cookie cookie = new Cookie("msg",msg);
//②将Cookie对象返回给浏览器并保存
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
@WebServlet("/demo02")
public class Demo02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//③获取Cookie对象
Cookie myCookie = null;//记录自己的Cookie对象
Cookie[] cookies = request.getCookies();
if (null != cookies && 0 != cookies.length) {
for (Cookie cookie : cookies) {
if ("msg".equals(cookie.getName())) {
myCookie = cookie;
}
}
}
if (null != myCookie) {
System.out.println("name : " + myCookie.getName() + " , value : " + myCookie.getValue());
} else {
System.out.println("没有找到自己的cookie");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
cookie的执行流程
执行流程
- ①浏览器发起第一次请求Demo01Servlet(msg)
- 创建Cookie对象(name=msg,value=hello)
- 通过Set-Cookie响应头将Cookie对象携带回浏览器
- ②浏览器发起第二次请求Demo02Servlet(msg)
- 通过Cookie请求头将Cookie对象信息携带到服务器
cookie的相关设置
- 值限制
- Cookie 的值不能包含逗号、分号、空格,不能以$开头。
- 存活时长限制 : setMaxAge
- -1 : 默认值,浏览会话结束时
- 0 :立即销毁
- 正数:设置cookie存活时长,以秒为单位
- 访问路径限制 : setPath
- 默认情况下,是"/项目访问路径",访问项目下所有资源都会携带Cookie
- 完全匹配
- 比如 : “/web15/xyz/index.html” , 只有"/web15/xyz/index.html"才会携带cookie
- 目录匹配
- 比如:"/web15/xyz","/web15/xyz/index.html"、"/web15/xyz/demo01.html"都 会携带cookie
cookie的销毁
- 开发步骤
- ①创建Cookie对象
- 设置相同的名称
- ②设置相同的访问路径
- ③设置maxAge=0
- ①创建Cookie对象
- 代码实现
@WebServlet("/demo06")
public class Demo06Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg3", "hello3");
cookie.setPath("/");
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
@WebServlet("/demo07")
public class Demo07Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//①创建Cookie对象
Cookie cookie = new Cookie("msg3", "helloworld");
//②设置相同的访问路径
cookie.setPath("/");
//③设置maxAge=0
cookie.setMaxAge(0);
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request