目录
一 会话概述
1.1 什么是会话?
日常生活中:从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话。
B/S架构中:从浏览器第一次给服务器发送请求时,建立会话;直到有一方断开,会话结束。
一次会话:包含多次请求响应。
1.2 会话技术
问题:Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解
作用:用于==存储==浏览器与服务器在请求和响应过程中产生的==数据==
客户端会话技术:cookie
服务器端会话技术:session
二 Cookie【重点】
2.1 概述
Cookie作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)
jd购物车
2.2 快速入门
public class SetServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.创建cookie对象,设置数据
Cookie cookie = new Cookie("name","jack");
// 2.通过response,响应(返回)cookie
response.addCookie(cookie);
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 1. 通过request对象,获取到携带的所有cookie
Cookie[] cookies = req.getCookies();
// 2. 遍历数组
if(cookies !=null ){
for (Cookie cookie : cookies) {
// 获取的就是cookie的name值
String name = cookie.getName();
// 获取cookie的value值
String value = cookie.getValue();
System.out.println(name + "----" + value );
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>GetServlet</servlet-name>
<servlet-class>com.lagou.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetServlet</servlet-name>
<url-pattern>/getServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SetServlet</servlet-name>
<servlet-class>com.lagou.servlet.SetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SetServlet</servlet-name>
<url-pattern>/setServlet</url-pattern>
</servlet-mapping>
2.3 工作原理
基于HTTP协议:请求头cookie 和 响应头 set-cookie
2.4 Cookie细节
2.4.1 服务器发送多个Cookie?
public class SetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建cookie对象,设置数据
Cookie cookie1 = new Cookie("name", "jack");
Cookie cookie2 = new Cookie("age", "18");
// 2. 通过response对象响应cookie
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.4.2 Cookie在浏览器保存时间?
public class MaxAgeCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建cookie对象,设置数据
Cookie cookie1 = new Cookie("name", "jack");
// 设置cookie的存活时间
// -1 浏览器关闭,cookie就销毁
// cookie1.setMaxAge(-1);
// 正数 存活60秒,过期销毁
// cookie1.setMaxAge(60*10);
// 0 立即销毁
cookie1.setMaxAge(0);
// 2. 通过response对象响应cookie
resp.addCookie(cookie1);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>MaxAgeCookie</servlet-name>
<servlet-class>com.lagou.servlet.MaxAgeCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MaxAgeCookie</servlet-name>
<url-pattern>/maxAgeCookie</url-pattern>
</servlet-mapping>
2.4.3 Cookie是否可以存储中文?
public class SetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建cookie对象,设置数据
String encodevalue = URLEncoder.encode("杰克 ", "UTF-8");
cookie1 = new Cookie("name", encodevalue);
Cookie cookie2 = new Cookie("age", "18");
// 2. 通过response对象响应cookie
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 1. 通过request对象,获取到携带的所有cookie
Cookie[] cookies = req.getCookies();
// 2. 遍历数组
if(cookies !=null ){
for (Cookie cookie : cookies) {
// 获取的就是cookie的name值
String name = cookie.getName();
// 获取cookie的value值
String decodevalue = URLDecoder.decode(value, "UTF-8");
System.out.println(name + "----" + decodevalue);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.5 Cookie特点
三 Session【重点】
3.1 概述
使用Cookie问题
1. 最多存储4K字符串
2. 存储数据不太安全
session作用:在一次会话的多次请求之间共享数据,将数据保存到服务器端
3.2 快速入门
HttpSession也是一个域对象
步骤分析
1. 将数据存储到session中
// 1.通过rquest对象,获取session对象
HttpSession session = request.getSession();
// 2.操作session的API,存储数据
session.setAttribute("username","哈哈,呵呵");2. 从session中获取数据
// 1.通过rquest对象,获取session对象
HttpSession session = request.getSession();
// 2.操作session的API,获取数据
session.getAttribute("username");
public class SetSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 将需要共享的数据存到session中
// 1.获取到session对象
HttpSession session = req.getSession();
// 2.通过session对象进行数据存入
session.setAttribute("name","哈哈,呵呵");
System.out.println("当前已将共享数据存到session中.....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class GetSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 将session中的共享数据取出来
// 1.获取session对象
HttpSession session = req.getSession();
// 2.获取共享数据
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.3 工作原理
Session基于Cookie技术实现
3.4 生命周期
四 三大域对象总结
request、session、ServletContext
4.1 API
4.2 生命周期
何时创建 | 何时销毁 | 作用范围 | |
---|---|---|---|
ServletContext | 服务器正常启动, 项目加载时创建 |
服务器关闭或 项目卸载时销毁 |
整个web项目 (共享数据) |
HttpSession | 用户第一次调用request.getSession() 方法时创建 |
服务器非正常关闭 未活跃状态30分钟 自杀 |
一次会话中,多次请求间 (共享数据) |
HttpServletRequest | 用户发送请求时创建 | 服务器响应后销毁 |
一次请求中,多次转发间 (共享数据) |
4.3 小结
能用小的不用大的:
request<session<servletContext
常用的场景:
request:一次查询的结果(servlet转发jsp)
session:存放当前会话的私有数据
用户登录状态
验证码用户登录状态
购物车
servletContext: 若需要所有的servlet都能访问到,才使用这个域对象.