7.1、会话
会话: 用户打开浏览器, 点击了很多超链接, 访问了多个web资源, 关闭浏览器。这个过 程可以称之为会话
有状态的会话: 一个同学来过教室, 下次再来教室, 我们就会知道这个同学曾经来过, 称之 为有状态的会话
如何让服务端证明客户端来过?
①服务端给客户端一个"信件"(Cookie)下次访问服务端带上信件就可以了; Cookie
②服务器登记你来过了, 下次来就可以直接与服务器匹配; Session
7.2、保存会话的两种技术
cookie
客户端技术(响应、请求)
session
服务器技术: 利用这个技术, 可以保存用户的会话信息! 可以把信息或者数据放在 Session中!
常见场景: 网站登陆之后, 以后就会自动登录
7.3、Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
![image.png](https://img-blog.csdnimg.cn/img_convert/8274cbcd226a3441b595e800b71ed606.png#clientId=ucc7cfb0b-41d7-4&from=paste&height=441&id=UyqS0&margin=[object Object]&name=image.png&originHeight=513&originWidth=771&originalType=binary&ratio=1&size=172222&status=done&style=none&taskId=u940fb906-0b03-48d8-8d27-81824b7405d&width=662.5)
Cookie[] cookies = request.getCookies();//服务器从客户端获取Cookie
cookie.getName()//获得Cookie的健
cookie.getValue()//获得Cookie的值
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个Cookie
cookie.setMaxAge(24*60*60);//设置Cookie有效期
response.addCookie(cookie);//服务器给客户端发送一个Cookie
cookie:一般会保存在本地的 用户目录下appdata;
细节问题
一个Cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie, 最多存放20cookie
cookie大小限制为4kb
300个cookie浏览器上限
package com.servlet;
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;
import java.io.PrintWriter;
import java.util.Date;
@WebServlet(name = "Cookie_1", value = "/Cookie_1")
public class Cookie_1 extends HttpServlet {
//保存用户上一次访问的时间
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服务器, 告诉你,你来的时间, 把这个时间封装成为一个"信件"(Cookie), 你下次带来你我就知道你来了
//解决中文乱码
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
//Cookie, 服务器端从客户端获取;
Cookie[] cookies = request.getCookies();//Cookie可能有多个
//判断Cookie是否存在
if (cookies != null) {
//如果存在
out.print("你上次访问时间是: ");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("lastLoginTime")) {
//获取cookie的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.print(date.toLocaleString());
}
}
}
//给服务器给客户端发送一个cookie(其实就是一个键值对)
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
response.addCookie(cookie);
//设置Cookie的有效期
cookie.setMaxAge(24*60*60);//有效期为一天
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
删除Cookie:
①不设置有效期, 关闭浏览器, 自动失效;
②设置有效期为0
③创建另一个Cookie手动删除
package com.servlet;
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(name = "Cookie_2", value = "/Cookie_2")
public class Cookie_2 extends HttpServlet {
//保存用户上一次访问的时间
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服务器, 清除原有的Cookie(Cookie_1)
//解决中文乱码
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
//创建一个Cookie, 名字必须与要删除的名字一致
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(0);//有效期为0
response.addCookie(cookie);//发送出去刷新lastLoginTime的cookie
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
编码解码问题
乱码解决方案: URLEncoder.encode("身伤易逝","utf-8") //编码
URLDecoder.decode(cookie.getValue(), "UTF-8"); // 解码
7.4、Session(重点)
什么是Session(会话):
①服务器会给每一个用户创建一个Session的对象
②一个Session独占一个浏览器, 只要浏览器不关 ,这个Session就一直存在;
③用户登录之后, 整个网站它都可以访问! 保存用户、购物车的信息……
![image.png](https://img-blog.csdnimg.cn/img_convert/f2197f10302a58a42e272c9abd2adcef.png#clientId=ucc7cfb0b-41d7-4&from=paste&height=379&id=ud46ad2d9&margin=[object Object]&name=image.png&originHeight=487&originWidth=732&originalType=binary&ratio=1&size=209843&status=done&style=none&taskId=uc5bcb4fb-d29d-44c3-99c9-985e9de4dbf&width=570)
使用场景:
①保存一个登陆用户的信息;
②购物车信息;
③在这个网站中经常会使用的数据, 我们将它保存在Session中;
获取Session:
//服务器得到Session
HttpSession se = request.getSession();
//给Session中存东西
se.setAttribute("name", "身伤易逝");//存一个字符串
Student stu1 = new Student("身伤易逝",19);
se.setAttribute("stu1", stu1);//存一个对象
//获取SessionId
String sessionId = se.getId();
//判断Session是不是新创建
if (se.isNew()) {
response.getWriter().println("session创建成功" + sessionId);
} else {
response.getWriter().println("session已经在服务器存在,ID: " + sessionId);
}
得到Session的信息:
//服务器得到Session
HttpSession se = request.getSession();
String name = (String) se.getAttribute("name");
Object stu1 = se.getAttribute("stu1");
response.getWriter().println("name : " + name);//打印信息
response.getWriter().println("stu1 : " + stu1.toString());//打印对象
移除Session及信息
//服务器得到Session
HttpSession se = request.getSession();
se.removeAttribute("name");//移除该信息
//手动注销Session
se.invalidate();//注销Session
Session自动过期
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后Session自动失效 以分钟为单位-->
<session-timeout>5</session-timeout>
</session-config>
7.5、Cookie与Session的区别
①Cookie是把用户的数据写给浏览器, 浏览器保存 (可以保存多个Cookie)
②Session把用户的数据写到用户独占的Seesion中, 服务器端保存 (保存重要的信息, 减少服务器资源的浪费)
③Session对象由服务创建;