1、会话跟踪技术
1.1、会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
如下所受,有三个浏览器向服务器发送了请求,从而建立了三个会话:
1.2、会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。数据共享的案例,例如:在用户登录后在页面显示用户名,购物平台在将商品加入购物车后点击结算时会有商品详情等等。
为什么需要会话跟踪技术?
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。
1.3、实现方式:
①、客户端会话跟踪技术:Cookie ②、服务端会话跟踪技术:Session
2、Cookie
2.1、Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
2.2、Cookie的基本使用:
①、发送cookie
②、获取cookie
//发送cookie
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 发送cookie
* */
//1、创建cookie对象
Cookie cookie = new Cookie("username", "zhangsan");
//2、发送cookie
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie数组
Cookie[] cookies = request.getCookies();
//遍历数组
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("username".equals(name)) {
//获取数据
String value = cookie.getValue();
System.out.println("name = " + name + "\tvalue = " + value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
运行上面的代码分别访问AServlet和BServlet,BServlet会获取到AServlet发送的cookie并且输出在控制台。
2.3、cookie的原理:
Cookie的实现是基于HTTP协议的:
响应头:set-cookie 请求头:cookie
如下所示:
2.4、cookie的存活时间:
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁。
cookie可以设置存活时间,如下所示:
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 发送cookie
* */
//1、创建cookie对象
Cookie cookie = new Cookie("username", "zhangsan");
//设置存活时间:7天
cookie.setMaxAge(60 * 60 * 24 * 7);
//2、发送cookie
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
2.5、cookie存储中文(cookie是不能直接存储中文的!!!)
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 发送cookie
* */
String name = "张三";
//采用url编码
String encode = URLEncoder.encode(name, "utf-8");
//1、创建cookie对象
Cookie cookie = new Cookie("username", encode);
//设置存活时间:7天
cookie.setMaxAge(60 * 60 * 24 * 7);
//2、发送cookie
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3、Session
服务端会话跟踪技术:将数据保存到服务端。JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能。
3.1、Session的使用:
@WebServlet("/AServletDemo1")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//存储数据(这里的第二个参数可以是任意的数据类型!!)
session.setAttribute("username", "zhangsan");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
//获取session
@WebServlet("/BServletDemo2")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从session中获取数据
//获取对象
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3.2、session原理:
3.3、session的钝化、活化
钝化:在服务器正常关闭后,Tomcat:会自动将Session数据写入硬盘的文件中。 活化:再次启动服务器后,从文件中加载数据到Session中。
3.4、session的销毁
其中invalidate方法是手动销毁的方法!!!!
4、cookie和session的比较
4.1、区别: