Cookie和Session
文章目录
1. 会话概述
会话概念:
当用户在浏览器中输入服务器地址,第一次访问服务器,会话就开始。用户多次发送请求给服务器,服务器做响应,这就是会话过程。当用户关闭浏览器,会话就结束。
两种会话技术:
Cookie:浏览器端会话技术,数据保存在浏览器内存或者文件中
Session:服务器端会话技术,数据保存在服务端。
2. Cookie
2.1 Cookie介绍
cookie是由服务器发送给浏览器一个或多个键值对,键和值都是String类型,可以设置过期时间,如果不设置过期时间,浏览器关闭后就失效。
- 在Chrome浏览器中查看Cookie
2.2 运行原理
2.3 Cookie类
Cookie类的方法 | 作用 |
---|---|
Cookie(String name, String value) | 通过构造方法创建一个Cookie 参数:键和值 |
String getName() | 得到Cookie的键 |
String getValue() | 得到Cookie的值 |
void setMaxAge(int explry) | 设置会话过期的时间,单位是秒 |
setPath(“路径”) | 设置Cookie访问的路径。 路径及其子路径都可以访问Cookie.其他路径不可访问。 |
- 写入Cookie(HttpServletResponse对象的方法)
addCookie(Cookie cookie)
:将服务器创建好的Cookie通过响应发送给浏览器。
- 读取Cookie(HttpServletRequest对象的方法)
Cookie[] getCookies()
: 服务器得到所有浏览器端发送过来的所有Cookie信息。
- 删除Cookie(Cookie类中的方法)
setMaxAge(0)
:设置生命周期为0,表示删除Cookie中的信息。
案例:
删除Cookie。(假设"visited"键值对已经创建。)
package com.zmysna.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;
import java.io.PrintWriter;
/**
* 删除 Cookie
*/
@WebServlet(urlPatterns = "/demo1")
public class Demo01Practice extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
//创建 Cookie 对象,与要删除的键同名
Cookie cookie = new Cookie("visited", "");
//设置路径
cookie.setPath(request.getContextPath());
//设置过期时间
cookie.setMaxAge(0);
//写入浏览器
response.addCookie(cookie);
//输出
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("删除 Cookie 成功");
}
}
3. HttpSession
3.1 Session技术介绍
session是服务器端的会话技术,数据保存在服务器的内存中,每个会话由一个自己的会话ID,保存自己的数据,其他会话不能访问,每个浏览器或每个用户代表一个不同的会话对象。
3.2 Session和Cookie的区别
- 存放位置:Session存放在服务器端,Cookie存放在客户端。
- 存储类型:Session键是String类型,值可以是Object类型。Cookie键和值都是String类型。
3.3 HttpSession接口的使用
- 通过请求对象获得Session对象
HttpSession request.getSession();
- HttpSession接口的方法
HttpSession接口方法 | 作用 |
---|---|
String getId() | 得到会话的ID,是一个唯一的32位16进制数字 |
long getCreatonTime() | 会话创建的时间。返回long类型。 |
long getLastAccessedTime() | 会话上次访问的时间 |
boolean isNew() | 判断是否是一个新的会话 |
ServletContext getServletContext() | 通过会话得到上下文对象 |
代码演示
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;
import java.io.PrintWriter;
import java.sql.Timestamp;
@WebServlet(name = "Demo2SessionServlet", urlPatterns = "/demo2")
public class Demo2SessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//得到会话对象
HttpSession session = request.getSession();
//得到会话的 ID,在服务器上唯一的 32 位的十六进制数
out.print("会话 ID:" + session.getId() + "<hr>");
//表示会话创建的时间,返回 long 类型。表示 1970-1-1 到这个时间之间相差的毫秒数
out.print("会话创建时间:" + new Timestamp(session.getCreationTime()) + "<hr>");
//表示会话上次访问的时间
out.print("上次访问的时间:" + new Timestamp(session.getLastAccessedTime()) + "<hr>");
//判断当前是否是一个新的会话,是的返回 true
out.print("是否新的会话:" + session.isNew() + "<hr>");
//通过会话得到上下文对象
out.print("上下文对象:" + session.getServletContext() + "<hr>");
}
}
结果
- 会话域的方法
HttpSession 的方法 | 作用 |
---|---|
Object getAttribute(" 名字") | 从会话域中得到一个值 |
void setAttribute(" 名字",Object 数据) | 向会话域中添加一对键和值 |
void removeAttribute(" 名字") | 从会话域中删除键和值 |
3.4 Session原理分析
-
第1次访问用户没有会话,调用getSession方法,服务器创建一个会话对象
-
每个会话都有一个唯一的ID,通过Cookie发送给浏览器。
-
浏览器得到会话ID,下次访问再通过Cookie发送给服务器,相当于带了密码条给服务器。
-
服务器通过Cookie中的ID,与服务器中会话ID进行比较,访问同一个会话域中数据
3.5 Session的过期时间
- 查看过期时间
int getMaxInactiveInterval()
:查看会话存活时间,默认是30分钟
- 设置过期时间
- 通过方法来设置
void setMaxInactiveInterval(int M)
: 设置过期时间,单位是秒。
- 通过web.xml设置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置会话过期的时间-->
<!--单位是分钟-->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
</web-app>
- 使会话立即失效
invalidate()
: 会话立刻失效,可以用于用户退出和注销。