1. Cookie原理解析
1.1 基本概念
- Cookie本意为”饼干“的含义,在这里表示客户端以“名-值”形式进行保存的一种技术。
- 浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器
- 然后浏览器会将这些数据以文本文件的方式保存起来。
- 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器
1.2 常用方法
- 使用javax.servlet.http.Cookie类的构造方法实现Cookie的创建。
Cookie(String name, String value) 根据参数指定数值构造对象
- 使用
javax.servlet.http.HttpServletResponse
接口的成员方法实现Cookie的添加。
-
void addCookie(Cookie cookie)
添加参数指定的对象到响应
- 使用
javax.servlet.http.HttpServletRequest
接口的成员方法实现Cookie对象的获取
-
Cookie[] getCookies()
返回此请求中包含的所有Cookie对象
- 使用
javax.servlet.http.Cookie
类的构造方法实现Cookie对象中属性的获取和修改
-
String getName()
返回此 Cookie 对象中的名字 -
String getValue()
返回此 Cookie 对象的数值 -
void setValue(String newValue)
设置 Cookie 的数值
1.3 代码案例
- CookieServlet
package cn.knightzz.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;
/**
* @author 王天赐
* @title: CookieServlet
* @projectName spring-aop-01
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @date 2022/1/9 18:58
*/
@WebServlet(name = "CookieServlet", urlPatterns = "/cookie-servlet")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 创建Cookie信息
Cookie cookie = new Cookie("name", "Tom");
// 2. 获取Cookie的默认使用期限 单位是 秒
int maxAge = cookie.getMaxAge();
System.out.println("maxAge = " + maxAge);
// 3. 修改Cookie的默认使用期限
cookie.setMaxAge(36000);
// 4. 将Cookie添加到响应信息中
resp.addCookie(cookie);
// 重定向到 success.html 页面
resp.sendRedirect("success.html");
}
}
- index.jsp
<html>
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h2>Hello World!</h2>
<a href="thread.html">Servlet Thread</a> |
<a href="cookie-servlet">Cookie</a>
</body>
</html>
- 访问 index.jsp 页面 点击 Cookie , 如下图所示, 在响应头和请求头携带相应的cookie
1.4 Cookie周期
- 默认情况下,浏览器会将Cookie信息保存在内存中,只要浏览器关闭,Cookie信息就会消失。
int getMaxAge()
返回cookie的最长使用期限(以秒为单位)void setMaxAge(int expiry)
设置cookie的最长保留时间(秒)- 如果希望关闭浏览器后Cookie信息仍有效,可以通过Cookie类的成员方法实现。
// 1. 创建Cookie信息
Cookie cookie = new Cookie("name", "Tom");
// 2. 获取Cookie的默认使用期限 单位是 秒
int maxAge = cookie.getMaxAge();
System.out.println("maxAge = " + maxAge);
// 3. 修改Cookie的默认使用期限
cookie.setMaxAge(36000);
// 4. 将Cookie添加到响应信息中
resp.addCookie(cookie);
1.5 Cookie原理
1.6 Cookie的路径问题
- 浏览器在访问服务器时,会比较
Cookie
的路径与请求路径是否匹配,只有匹配的Cookie
才会发送
给服务器。 - Cookie 的默认路径等于添加这个 Cookie 信息时的组件路径,例如:
/web-servlet-03
请求添加
了一个 Cookie 信息,则该 Cookie 的路径是/web-servlet-03
-
void setPath(String uri)
设置cookie
的路径信息 - 访问的请求地址必须符合 Cookie 的路径或者其子路径时,浏览器才会发送 Cookie 信息
1.7 Cookie的特点
- Cookie技术不适合存储所有数据,只用于存储少量、非敏感信息,原因如下:
- 将状态数据保存在浏览器端,不安全。
- 保存数据量有限制,大约4KB左右。
- 只能保存字符串信息。
- 可以通过浏览器设置为禁止使用
2. Session概念与原理
2.1 基本概念
- Session本意为"会话"的含义,是用来维护一个客户端和服务器关联的一种技术。
- 浏览器访问服务器时,服务器会为每一个浏览器都在服务器端的内存中分配一个空间,用于创建一
个Session对象,该对象有一个id属性且该值唯一,我们称为SessionId,并且服务器会将这个SessionId以Cookie方式发送给浏览器存储。 - 浏览器再次访问服务器时会将SessionId发送给服务器,服务器可以依据SessionId查找相对应的
Session对象
2.2 相关方法
- 使用javax.servlet.http.HttpServletRequest接口的成员方法实现Session的获取。
-
HttpSession getSession()
返回此请求关联的当前Session,若此请求没有则创建一个
- 使用javax.servlet.http.HttpSession接口的成员方法实现判断和获取
-
boolean isNew()
判断是否为新创建的Session -
String getId()
获取Session的编号,唯一的属性值 sessionId
- 使用
javax.servlet.http.HttpSession
接口的成员方法实现属性的管理。
-
Object getAttribute(String name
) 返回在此会话中用指定名称绑定的对象,如果没有对象在
该名称下绑定,则返回空值 -
void setAttribute(String name, Object value)
使用指定的名称将对象绑定到此会话 -
void removeAttribute(String name)
从此会话中删除与指定名称绑定的对象
2.3 代码案例
- SessionServlet
package cn.knightzz.servlet;
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;
/**
* @author 王天赐
* @title: SessionServlet
* @projectName spring-aop-01
* @description:
* @website http://knightzz.cn/
* @github https://github.com/knightzz1998
* @date 2022/1/10 21:36
*/
@WebServlet(name = "SessionServlet", urlPatterns = "/session-servlet")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取session
HttpSession session = req.getSession();
System.out.println("session.isNew() = " + session.isNew());
System.out.println("session.getId() = " + session.getId());
// 2. 设置session属性
session.setAttribute("session-name", "Session");
String attribute = (String) session.getAttribute("session-name");
System.out.println("attribute = " + attribute);
// 3. 设置生命周期
int maxInactiveInterval = session.getMaxInactiveInterval();
System.out.println("maxInactiveInterval = " + maxInactiveInterval);
// 设置失效时间, Session对象一般是默认30分钟失效
session.setMaxInactiveInterval(3600);
}
}
2.4 Session生命周期
- 为了节省服务器内存空间资源,服务器会将空闲时间过长的Session对象自动清除掉,服务器默认
的超时限制一般是30分钟。 - 使用javax.servlet.http.HttpSession接口的成员方法实现失效实现的获取和设置
- 常用方法
-
int getMaxInactiveInterval()
获取失效时间 -
void setMaxInactiveInterval(int interval)
设置失效时间
- 可以配置web.xml文件修改失效时间。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2.5 Session原理
- 注意 : SessionId 是 服务器和浏览器之间建立的, 而不是 Servlet对象和浏览器, 所以多个Servlet仅有一个Session对象
2.6 Session特点
- 数据比较安全。
- 能够保存的数据类型丰富,而Cookie只能保存字符串。Session的 Value 可以存储 Object
- 能够保存更多的数据,而Cookie大约保存4KB。
- 数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务
器的性能。