第五天:会话技术 cookie session
什么叫会话?
会话:当用户打开浏览器到关闭浏览器之间所做的一系列请求称之为一次会话。
会话技术:在一次会话的多次请求之间共享数据
因为http协议是无状态的(不能共享数据,每次请求独立的)
会话技术有两种:cookie和session
cookie:
特点:数据会保存在浏览器中
在响应头 set-cookie:code=swlz
请求头会有cookie:code=swlz
例子:
package com.swlz.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;
@WebServlet("/servletCookieDemo1")
public class ServletCookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="swlz";
//创建cookie对象,设置初始化值 code 以键值对的形式
Cookie cookie = new Cookie("code", code);
response.addCookie(cookie);//响应cookie,添加cookie
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package com.swlz.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;
@WebServlet("/servletCookieDemo")
public class ServletCookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();//获取cookie
if(cookies!=null&&cookies.length>0){
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
response.getWriter().println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
细节:设置cookie有效路径 唯一确定cookie就需要通过path和name
例子如下:
package com.swlz.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;
@WebServlet("/servletCookieDemo2")
public class ServletCookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="swlz-path";
Cookie cookie = new Cookie("code", code);
//设置cookie有效路径 有效路径是什么意思?
// 以后只有浏览器访问这个路径的资源才会携带cookie(只有访问带有/user的访问路径才会携带cookie,其他的不会携带)
//如果你不设置就是/
cookie.setPath("/user");
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
cookie的类别
a) 持久级别的cookie
我们可以通过setMaxAge方法设置cookie的有效时间,只有设置的参数大于0,这个cookie就变成了持久级别的cookie了
删除持久级别的cookie可以设置cookie的有效时间为0
b) 会话级别的cookie
- Cookie保存在浏览器内存中,浏览器关闭,cookie消失(一次会话范围内有效)
session:
特点:数据会保存在服务器中
session的实现基于cookie
Jsessionid存储在cookie中
package com.swlz.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletSessionDemo1")
public class ServletSessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
// System.out.println(code);
response.getWriter().println(code);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package com.swlz.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletSessionDemo")
public class ServletSessionDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="6666";
HttpSession session = request.getSession();
session.setAttribute("code",code);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Session细节:
- 浏览器关闭之后,Session并不会立马销毁,session销毁的默认时间为30分钟
- Session可以作为域对象存储数据
- 作用范围:
一次会话
Request 一次请求
Session 一次会话的多次请求之间
ServeltContext 整个web项目
- Session的生命周期
创建:浏览器第一次调用request的getSession方法的时候创建Session
销毁:
- 30分钟有效时间到期,web.xml
- 手动调用了session的session.invalidate();
- 服务器非正常关闭的时候Session会销毁,正常关闭服务器Session会被钝化(序列化)到磁盘,下一次重新启动tomcat的时候session又会被锐化(反序列化)到内存中
注意:
在idea中,每次发布项目都会创建tomcat的临时配置,每次重启tomcat,配置文件都会重新生成(之前的会被删除)
用户发送请求到服务器处理的流程(个人理解):

http(超文本传输协议)
特点:1.基于tcp/ip模型
2.基于请求和响应模型有一次请求就会有一次响应
3.安全
4.无状态
请求流程(个人理解):
用户第一次在浏览器发送请求,服务器(tomcat)会帮你从服务器中找到你请求的资源对应的servlet,帮你把你请求的数据封装起来,创建request对象,然后创建response对象,封装好response的数据(响应行,响应头,响应体),返回到浏览器,请求的数据会响应到页面,展示给用户。
tomcat帮你创建request对象和
帮你封装好request
Cookie 和 Session区别:
- cookie的数据是保持在浏览器中的,Session的数据是保存在服务器中的
- cookie相对不安全,session安全
- cookie只能保存少量的数据到浏览器(对每个cookie的大小有限制,并且对每个项目的cookie数据也有限制),Session对保存的数据量和个数没有限制
今日学习感受:javaweb的多学重在多理解,知道原理和意思,知道用户从客户端发送请求到浏览器的流程是一个什么情况。最后一句话:勤学多思。