1. cookie原理解析
1.1 基本概念1.2 常用方法1.3 代码案例1.4 cookie周期1.5 cookie原理1.6 cookie的路径问题1.7 cookie的特点 2. Session概念与原理
2.1 基本概念2.2 相关方法2.3 代码案例2.4 Session生命周期2.5 Session原理2.6 Session特点
1. cookie原理解析 1.1 基本概念cookie本意为”饼干“的含义,在这里表示客户端以“名-值”形式进行保存的一种技术。
- 浏览器向服务器发送请求时,服务器将数据以Set-cookie消息头的方式响应给浏览器然后浏览器会将这些数据以文本文件的方式保存起来。当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送给服务器
使用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; @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
Index Hello World! Servlet Thread | cookie
访问 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-03void 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; @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文件修改失效时间。
2.5 Session原理30
注意 : SessionId 是 服务器和浏览器之间建立的, 而不是 Servlet对象和浏览器, 所以多个Servlet仅有一个Session对象 2.6 Session特点
数据比较安全。能够保存的数据类型丰富,而cookie只能保存字符串。Session的 Value 可以存储 Object能够保存更多的数据,而cookie大约保存4KB。数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务
器的性能。