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()
判断是否为新创建的SessionString 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。
- 数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务
器的性能。