servlet中cookie和session操作

本文介绍了Web开发中的会话管理技术,包括Cookie和Session的工作原理、使用方法及其应用场景。重点讲解了如何利用这两种技术来保存用户的会话数据。
1.1 软件中的会话

一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器

 

登录场景:

打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)

修改密码(输入原密码)

 修改收货地址

.......

 

问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?

 

购物场景:

 打开浏览器 -> 浏览商品列表  -> 加入购物车(把商品信息保存下来)  -> 关闭浏览器

 打开浏览器->  直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付

 

问题: 在购物会话过程中,如何保存商品信息??

 

会话管理: 管理浏览器客户端 服务器端之间会话过程中产生的会话数据。

 

域对象: 实现资源之间的数据共享。

 

request域对象

context域对象

 

登录场景:

小张: 输入“张三” (保存数据: context.setAttribute("name","张三")-> 用户主页(显示“张三”)

小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) -> 用户主页(显示“李四”)

 

问题: context是所有用户公有的资源!!!会覆盖数据。

 

小张: 输入“张三”(保存数据: request.setAttribute("name","张三")- > 用户主页(显示“张三”) 问题: 一定要使用转发技术来跳转页面!!!

 

解决办法: 可以使用session域对象来保存会话数据!!!

1.2 会话技术

Cookie技术:会话数据保存在浏览器客户端。

Session技术:会话数据保存在服务器端。

 

 

2 Cooke技术

2.1 特点

Cookie技术:会话数据保存在浏览器客户端。

2.2 Cookie技术核心

Cookie类:用于存储会话数据

 

1)构造Cookie对象

Cookie(java.lang.String name, java.lang.String value)

2)设置cookie

void setPath(java.lang.String uri)   :设置cookie的有效访问路径

void setMaxAge(int expiry)  设置cookie的有效时间

void setValue(java.lang.String newValue) :设置cookie的值

3)发送cookie到浏览器端保存

void response.addCookie(Cookie cookie)  : 发送cookie

4)服务器接收cookie

Cookie[] request.getCookies()  : 接收cookie

 

2.3 Cookie原理

1)服务器创建cookie对象,把会话数据存储到cookie对象中。

new Cookie("name","value");

2 服务器发送cookie信息到浏览器

response.addCookie(cookie);

 

举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)

3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

4)浏览器在下次访问服务器时,会带着cookie信息

    举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)

5)服务器接收到浏览器带来的cookie信息

request.getCookies();

 

2.4 Cookie的细节

1void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

 

2void setMaxAge(int expiry)  设置cookie的有效时间。

正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。

负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!

零:表示删除同名的cookie数据

3Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB

 

3 Session技术

3.1 引入

Cookie的局限:

1Cookie只能存字符串类型。不能保存对象

2)只能存非中文。

31Cookie的容量不超过4KB

 

如果要保存非字符串,超过4kb内容,只能使用session技术!!!

 

Session特点:

会话数据保存在服务器端。(内存中)

 

3.2 Session技术核心

HttpSession类:用于保存会话数据

 

1)创建或得到session对象

HttpSession getSession()  

HttpSession getSession(boolean create)  

2)设置session对象

void setMaxInactiveInterval(int interval)   设置session的有效时间

void invalidate()      销毁session对象

java.lang.String getId()   得到session编号

3)保存会话数据到session对象

void setAttribute(java.lang.String name, java.lang.Object value)   保存数据

java.lang.Object getAttribute(java.lang.String name)   获取数据

void removeAttribute(java.lang.String name) 清除数据

3.3 Session原理

问题: 服务器能够识别不同的浏览者!!!

现象:

 

   前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!

浏览器1(s1分配一个唯一的标记:s001,s001发送给浏览器)

1)创建session对象,保存会话数据

HttpSession session = request.getSession();   --保存会话数据 s1

浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1

1)得到session对象的会话数据

    HttpSession session = request.getSession();   --可以取出  s1

 

新的浏览器1(没有带s001,不能返回s1)

1)得到session对象的会话数据

    HttpSession session = request.getSession();   --不可以取出  s2

 

浏览器2(没有带s001,不能返回s1)

1)得到session对象的会话数据

    HttpSession session = request.getSession();  --不可以取出  s3

 

 

代码解读:HttpSession session = request.getSession();

 

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

new HttpSession();

2)把JSESSIONID作为Cookie的值发送给浏览器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)第二次访问的时候,浏览器带着JSESSIONIDcookie访问服务器

4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

if(找到){

return map.get(sessionID);

}

Map<String,HttpSession>]

 

 

<"s001", s1>

<"s001,"s2>

5)如果找到对应编号的session对象,直接返回该对象

6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程

 

结论:通过JSESSIONcookie值在服务器找session对象!!!!!

3.4 Sesson细节

1java.lang.String getId()   得到session编号

2)两个getSession方法:

getSession(true) / getSession()  : 创建或得到session对象。没有匹配的session编号,自动创 建新的session对象。

getSession(false):              得到session对象。没有匹配的session编号,返回null

3void setMaxInactiveInterval(int interval)   设置session的有效时间

session对象销毁时间:

3.1 默认情况30分服务器自动回收

3.2 修改session回收时间

3.3 全局修改session有效时间

 

<!-- 修改session全局有效时间:分钟 -->

<session-config>

<session-timeout>1</session-timeout>

</session-config>

 

3.4.手动销毁session对象

void invalidate()      销毁session对象

4)如何避免浏览器的JSESSIONIDcookie随着浏览器关闭而丢失的问题

 

/**

 * 手动发送一个硬盘保存的cookie给浏览器

 */

Cookie c = new Cookie("JSESSIONID",session.getId());

c.setMaxAge(60*60);

response.addCookie(c);

 

总结:

1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

 

2Cookie技术:

new Cookie("name","value")

response.addCookie(coookie)

request.getCookies()

3Session技术

request.getSession();

 

setAttrbute("name","会话数据");

getAttribute("会话数据")

### ServletCookie Session 的定义及其相互关系 #### 1. Servlet 的定义 Servlet 是 Java 编程语言中的一个类,用于在服务器端处理客户端的请求并生成响应。它是 Java Web 应用程序的核心组件之一,运行在支持 Java 的 Web 服务器或应用服务器中[^2]。当用户通过浏览器访问一个网站的某个页面时,服务器会调用相应的 Servlet 来处理这个请求,并将处理结果返回给浏览器。 #### 2. Cookie 的定义 Cookie 是一种存储在客户端的小型文本文件,用于保存用户的会话信息或其他数据。Cookie 可以由服务器创建并通过 HTTP 响应发送到客户端,客户端(通常是浏览器)会在后续的请求中自动将这些 Cookie 发送到服务器。如果用户端的浏览器指向任何匹配该 Cookie 的路径域的页面,他会重新发送 Cookie 到服务器,浏览器的头信息可能会如下所示[^2]。此时,Servlet 能够通过 `request.getCookies()` 方法访问 Cookie,该方法将返回一个 `Cookie` 对象的数组。 以下是一个获取客户端 Cookie 的代码示例: ```java Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { String cookieName = c.getName(); String cookieValue = c.getValue(); System.out.println(cookieName + " = " + cookieValue); } } ``` #### 3. Session 的定义 Session 是一种用于在服务器端保存用户会话状态的机制。当用户发送一个 HTTP 请求到服务器时,服务器会检查该请求是否包含会话标识符(通常是存放在 Cookie 中的 JSESSIONID)。如果没有,则会创建一个新的会话(Session),并将会话标识符发送给客户端。浏览器再发送请求时会携带会话标识符,此时服务器根据会话标识符就可以找到对应的会话(存储区域)[^5]。 例如,用户登录成功后,服务器会为用户创建一个对应的会话(Session),并生成一个唯一的 JSESSIONID。JSESSIONID 作为键值对的一部分被保存到服务器类似于哈希表的数据结构中,并将 JSESSIONID 通过 HTTP 响应发送给浏览器。浏览器会将 JSESSIONID 保存Cookie 中,下次发送 HTTP 请求时会带上 Cookie 中的内容[^4]。 #### 4. ServletCookie Session 的相互关系 - **Servlet Cookie**:Servlet 可以通过 `request.getCookies()` 方法获取客户端发送过来的 Cookie。此外,Servlet 还可以使用 `response.addCookie()` 方法向客户端发送新的 CookieCookie 的超时时间也叫过期时间,是指浏览器存储 Cookie 的有效时长。如果没有设置超时时间,Cookie 就会成为会话 Cookie,它会在浏览器会话期间一直存在,一旦浏览器关闭,会话 Cookie 就会被删除[^3]。 - **Servlet Session**:Servlet 使用 `request.getSession()` 方法来获取当前用户的会话对象。如果会话不存在,Servlet 会自动创建一个新的会话。Session 的实现依赖于 Cookie,通常会使用名为 `JSESSIONID` 的 Cookie 来跟踪用户的会话状态[^5]。 - **Cookie Session**:CookieSession 的基础,Session 的标识符(如 JSESSIONID)通常存储在 Cookie 中。当用户首次访问服务器时,如果没有找到与请求关联的 Session,则服务器会创建一个新的 Session,并将 Session ID 存储在 Cookie 中发送给客户端。客户端在后续请求中会自动将该 Cookie 发送给服务器,从而实现会话的持续跟踪[^4]。 ### 示例代码:创建管理 Cookie 以下是一个创建管理 Cookie 的示例代码: ```java // 创建一个 Cookie Cookie userCookie = new Cookie("username", "JohnDoe"); userCookie.setMaxAge(60 * 60); // 设置 Cookie 的有效期为 1 小时 response.addCookie(userCookie); // 获取所有 Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { if ("username".equals(c.getName())) { String username = c.getValue(); System.out.println("Username: " + username); } } } ``` ### 示例代码:使用 Session 以下是一个使用 Session 的示例代码: ```java // 获取或创建 Session HttpSession session = request.getSession(); // 在 Session 中存储数据 session.setAttribute("user", "JohnDoe"); // 从 Session 中获取数据 String user = (String) session.getAttribute("user"); System.out.println("User from session: " + user); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值