会话技术:
首先在Http协议中,他们的关系是独立的,就是说,第一次发送和接收的东西与第二次发送和接受的东西是相互独立的,这样就不利于数据的共享,比如说我逛淘宝,我一次加入一个东西到购物车,这样我加入多个东西以后,我进行下单,希望是一起下单,而不是一个一个下单,如果用http就达不到这个要求,但是用会话技术就可以达到这个要求。
会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
功能:在一次会话的范围内的多次请求间,共享数据。
方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
Cookie:
概念:客户端会话技术,将数据保存到客户端。
大致执行流程如下所示:
请求给了数据,客户端中存下该数据,第二次请求,它又把该数据发给浏览器。
快速入门:
使用步骤:
1.创建Cookie对象,绑定数据
new Cookie(String name, String value)传入Cookie的名字和值。
2.发送Cookie对象
response中有一个addCookie(Cookie cookie)方法
3.获取Cookie,拿到数据
在request中有一个获得Cookies的方法
Cookie[] request.getCookies()
测试:先新建一个类
新建一个servlet
新建一个路径是/cookieDemo1HttpServlet的实现类代码如下:
package cn.sainan114.cookie;
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;
/**
* FileName: CookieDemo1
*
* @Author:luguobao Date: 19:33
* Description:
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c = new Cookie("msg", "hello");
//2.发送Cookie
resp.addCookie(c);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
在这里浏览器去访问服务器对象,然后,服务器对象创建了cookie对象,并且返回给浏览器对象数据。然后,我们在创建一个HttpServlet的实现类,因为Cookie对象是第二次访问的时候还是会携带的。所以,我们在第二次访问的时候,接受所有的Cookie对象,并且将它打印出来。代码如下:
package cn.sainan114.cookie;
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;
/**
* FileName: CookieDemo1
*
* @Author:luguobao Date: 19:33
* Description:
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3.获取Cookie
Cookie[] cs = req.getCookies();
//遍历数据
if(cs != null){
for (Cookie c :
cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name + ":" + value);
}
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
经过访问:发现如下结果:
至少说明,我们自己的那个cookie是获取出来了。
实现原理
用图像进行表示:
原理分析:首先,客户端请求/CookieDemo1,然后服务器发送cookie给浏览器,上面会带有响应头set-cookie:msg=hello,客户端收到以后,将cookie的数据存下来,当第二次访问/CookieDemo2的时候,会在请求头上写着cookie:msg=hello。而因为响应头中没有发送cookie。所以,响应头中什么都没有。
测试:第一次访问:/CookieDemo1响应头里面有msg=hello
第二次访问/CookDemo2
响应头里面什么都没有,请求头里面有msg=hello。
实现原理是基于响应头set-cookie和请求头cookie实现
cookie的细节:
1.一次可不可以发送多个cookie
可以
可以创建多个对象,使用resp调用多次addCookie方法发送cookie即可。
编写/cookieDemo3
先访问/cookieDemo3将cookie发送给浏览器,响应头如下:
然后,在访问之前的/cookieDemo2将浏览器请求的cookie给显示出来。
可以得到如下结果。
注意:只要访问/cookieDemo3过,不管以后访问谁都会带有请求头,只是访问/cookieDemo2的目的是,将里面的内容给打印出来。
2.cookie在浏览器中保存多长时间
1.默认情况下,当浏览器关闭后,Cookie数据被销毁(默认保存到浏览器内存中)
2.如果想cookie的信息持久化的存储下来,则需要存到硬盘中。
setMaxAge(int seconds)
1.正数:将Cookie数据写到硬盘文件中,持久化存储,正数也代表他的存活时间。假设传的是30,则30秒后,文件将自动清除掉。
2.负数:默认值
3.零:删除cookie信息
3.cookie能不能存中文
在tomcat8之前,cookie中不能直接存储中文数据
需要将中文数据转码 一般为url编码
在tomcat8之后,可以存储。
先访问/cookieDemo5,再访问/cookieDemo2可以得到如下结论
4.cookie获取范围有多大
获取范围:假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
假设一个项目有两个虚拟目录,/day15和/day16,假设day15目录下有发送了cookie对象,在/day15目录下肯定是可以获取到的,但是,在/day16下面能不能获取到呢?答案默认是不能的。
但是,它里面有一个方法:
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录。比如上面的目录是setPath("/day15")
如果要共享,则可以将path设置为"/"
下面进行双项目的部署:先创建一个javaee的模块,改名称
在day15上改一下虚拟目录:
然后,再把day16也部署进来
最终结果如下:
此时,服务器一启动两个项目都会被部署。
在day15下写如下的类:
我先在day16下访问/cookieDemo5理论上,服务器会发送cookie对象给浏览器。
然后,我再访问cookieDemo看看req中有没有cookie数据,要是有的话,给他打印出来。结果如下:
没有 msg:你好 的数据。所以,可以证明在它只可以在一个虚拟路径下访问。