目录
1.认识Cookie对象与HttpSession
1.1概念
1.2会话管理
2.2修改或者删除Cookie
2.3 Cookie对象的特点
2.4 Cookie对象的创建
2.5 Cookie中数据的获取
2.6 Cookie不支持中文的解决方案
2.7持久化Cookie和状态Cookie
2.8Cookie跨域问题
编辑
4.httpSession的使用
4.1 HttpSession的工作原理
4.2HttpSession对象的特点
4.3HttpSession对象的创建
4.4HttpSession中数据的获取
4.5HttpSession的销毁
4.6HttpSession生命周期
4.7HttpSession的使用注意事项
5.httpSession的案例
6.服务器端Session、客户端Session和Cookie的区别
1.认识Cookie对象与HttpSession
1.1概念
Cookie对象与HttpSession对象是维护客户端浏览器与服务端的会话状态的两个对象。由于HTTP协议是一个无状态的协议,所以服务端并不会记录当前客户端浏览器的访问状态,但是在有些时候我们是需要服务端能够记录客户端浏览器的访问状态的。
cookie是产生与服务端,保存在客户端的一种技术,它是以键值对的形式来保存少量文本,他的大小最多只有4K.通过每次http请求时携带这些存储的少量文本数据的方式来与服务端交互,以实现所谓状态记录的效果。
httpSession简称session,它是产生与服务端,并保存于服务端的一种技术,也是以键值对的形式来保存数据,不过相较于cookie保存的数据更多。,第一请求时,服务器会创建HttpSession,我们可以在HttpSession对象中保存一些关于用户的状态信息。
1.2会话管理
- 一般多数情况下,是这样描述的:用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。
- 本质上的描述:从session对象的创建,到最终session对象超时之后销毁,这个才是真正意义的一次完整会话。
2.cookie的使用
2.1cookie使用机制
维度1.每次都会被浏览器自动放在http请求头中存放多个cookie
维度2,.存储在cookie中的数据(1个键值对),每次都会被浏览器自动放在http请求头中,当然这个数据要是太大,会增加网络开销。如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了服务器的重复处理逻辑。所以对于那设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。
2.2cookie不同属性的含义
可见response httpHeader中返回了所有的 Cookie, Request Headers中包含了所有Cookie。Cookie是以键值对的形式存储的(name和value)。当然对于一个完整cookie来说除了name,value还有其他的属性,下面是整理出来的几个常用属性。
当maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。
Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
// MaxAge为负数,是一个临时Cookie,不会持久化
cookie.setMaxAge(-1);
resp.addCookie(cookie);
可以看到,当MaxAge为-1时,时间已经过期
那么maxAge设置为负值和0到底有什么区别呢?
maxAge设置为0表示立即删除该Cookie,如果在debug的模式下,执行上述方法,可以看见cookie立即被删除了。
maxAge设置为负数,能看到Expires属性改变了,但Cookie仍然会存在一段时间直到关闭浏览器或者重新打开浏览器。
2.2修改或者删除Cookie
HttpServletResponse提供的Cookie操作只有一个addCookie(Cookie cookie),所以想要修改Cookie只能使用一个同名的Cookie来覆盖原先的Cookie。如果要删除某个Cookie,则只需要新建一个同名的Cookie,并将maxAge设置为0,并覆盖原来的Cookie即可。
新建的Cookie,除了value、maxAge之外的属性,比如name、path、domain都必须与原来的一致才能达到修改或者删除的效果。否则,浏览器将视为两个不同的Cookie不予覆盖。
值得注意的是,从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期,而不能用服务端来判断。
我们无法在服务端通过cookie.getMaxAge()来判断该cookie是否过期,maxAge只是一个只读属性,值永远为-1。当cookie过期时,浏览器在与后台交互时会自动筛选过期cookie,过期了的cookie就不会被携带了。
2.3 Cookie对象的特点
Cookie使用字符串存储数据
Cookie使用Key与Value结构存储数据
单个Cookie存储数据大小限制在4097个字节
Cookie存储的数据中不支持中文,Servlet4.0中支持
Cookie是与域名绑定所以不支持跨一级域名访问(默认只能在站内使用)
Cookie对象保存在客户端浏览器内存上或系统磁盘中
Cookie分为持久化Cookie(保存在磁盘上)与状态Cookie(保存在内存上)
浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个
浏览器每次请求时都会把与当前访问的请求中的所有的Cookie,提交到服务端。一个cookie只存储一个键值对。一个请求中可存储多个cookie。
2.4 Cookie对象的创建
Cookie cookie = new Cookie("key","value")
服务端(后台代码)通过new关键字创建Cookie对象response.addCookie(cookie)
服务端(后台代码)通过HttpServletResponse对象将Cookie传递给客户端浏览器。
2.5 Cookie中数据的获取
通过HttpServletRequest对象获取Cookie,返回Cookie数组。
Cookie[] cookies = request.getCookies()
可见cookie的获取前端可以获取,后台也可以获取,只需要从httpServletRequest中拿就行。
2.6 Cookie不支持中文的解决方案
在Servlet4.0版本之前的Cookie中是不支持中文存储的,如果存储的数据中含有中文,代码会直接出现异常。我们可以通过对含有中文的数据重新进行编码来解决该问题。在Servlet4.0中的Cookie是支持中文存储的。
可以使用对中文进行转码处理URLEncoder.encode("content","code")
将内容按照指定的编码方式做URL编码处理。
URLDecoder.decode("content","code")
将内容按照指定的编码方式做URL解码处理。
2.7持久化Cookie和状态Cookie
状态Cookie:浏览器会缓存Cookie对象。浏览器关闭后Cookie对象销毁。
持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。
当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.setMaxAge(60)方法设置失效时间,单位为秒。一旦设置了失效时间,那么该Cookie为持久化Cookie,浏览器会将Cookie对象持久化到磁盘中。当失效时间到达后文件删除。
2.8Cookie跨域问题
3.cookie的案例
package org.example;
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:
* @Description: MircoMessage:Mark_7001
*/
@WebServlet(urlPatterns = "/servlet3.do")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过响应对象,向浏览器响应一些Cookie
Cookie c1 = new Cookie("age", "10");// 状态Cookie 重启即清除
Cookie c2 = new Cookie("gender", "男");// 持久化Cookie 让浏览器保留1分钟
c2.setMaxAge(60);// 秒钟 持久化Cookie 让浏览器保留1分钟
resp.addCookie(c1);
resp.addCookie(c2);
}
}
package com.mashibing.test;
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 javax.xml.ws.WebEndpoint;
import java.io.IOException;
/**
* @Author: Ma HaiYang
* @Description: MircoMessage:Mark_7001
*/
@WebServlet(urlPatterns = "/servlet2.do")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 读取请求中的Cookie
Cookie[] cookies = req.getCookies();
//cookies不为null
if(null != cookies){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+"="+cookie.getValue());
}
}
}
}
4.httpSession的使用
4.1 HttpSession的工作原理
1. 打开浏览器,在浏览器上发送首次请求
2. 服务器会创建一个HttpSession对象,该对象代表一次会话
3. 同时生成HttpSession对象对应的Cookie对象,如果服务器是tomcat ,则Cookie对象的name是jsessionid,Cookie的value是32位长度的字符串(jsessionid=xxxx)。Tomcat提供jsessionId值得生成方式:随机数+时间戳+jvmid.另外,session的使用是离不开cookie的,因为session的key 是通过Cookie的方式传给浏览器的。
4. 服务器将Cookie的value和HttpSession对象绑定到session列表中
5. 服务器将Cookie完整发送给浏览器客户端
6. 浏览器客户端将Cookie保存到缓存中
7. 只要浏览器不关闭,Cookie就不会消失
8. 当再次发送请求的时候,会自动提交缓存中当的Cookie
9. 服务器接收到Cookie,验证该Cookie的name是否是jsessionid,如是,则获取该Cookie的value
10. 通过Cookie的value去session列表中检索对应的HttpSession对象
分析一下,如果我们在HttpSession对象中保存一些关于用户的状态信息,那么有了session技术后,不就可以让http协议,或者说请求有了状态嘛。
要注意的是:
当浏览器关闭之后,缓存中的cookie消失,这样客户端下次再访问服务器的时候就无法获取到服务器端的session对象了。这就意味着会话已经结束,但是并不代表服务器端的session对象马上被回收,session对象仍然在session列表中存储,当长时间没有用户访问这个session对象了,我们称作session超时,此时web服务器才会回收session对象。
4.2HttpSession对象的特点
HttpSession保存在服务端
HttpSession可以存储任何类型的数据
HttpSession使用Key与Value结构存储数据 value是Object类型
HttpSession存储数据大小无限制
4.3HttpSession对象的创建
HttpSession对象的创建是通过request.getSession()方法来创建的。客户端浏览器在请求服务端资源时,如果在请求的cookie中没有key为jesessionId的cookie,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并将这个对象放入session map表中,同时会对应的生成一个key为jessionId(如果是tomcat服务器的话),value为32位长度的字符串的cookie。这个cookie和session的关系是,
cookie的key是固定的"jessionId",cookie的value是session对象在session map表中的key。
然后在响应中通过Cookie写回给客户端浏览器。
浏览器再次请求服务器时,如果在请求中包含了key为jesessionId的cookie,则获取该Cookie的value。通过Cookie的value去session列表中检索对应的HttpSession对象 。然后返回,然后进行业务上的逻辑处理。如果sessiono map 表中 没有SessionID,则getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象
getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据SessionID查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有SessionID则不会创建新的HttpSession对象。
4.4HttpSession中数据的获取
将数据存储到HttpSession对象中
session.setAttribute("key",value)
根据key获取HttpSession中的数据,返回Object
Object value = session.getAttribute("key")
获取HttpSession中所有的key,返回枚举类型
Enumeration<String> attributeNames = session.getAttributeNames()
根据key删除HttpSession中的数据
session.removeAttribute("key")
根据获取当前HttpSession的SessionID,返回字符串类型
String id = session.getId()
4.5HttpSession的销毁
当很长一段时间(这个时间可以配置)没有用户再访问session对象,此时session对象超时,web服务器会自动回收session对象
可以配置这个超时时间,在web.xml文件中,其默认是30分钟
<session-config> <session-timeout>120</session-timeout> </session-config>
3、那什么情况下才是一次会话结束呢?
1.浏览器关闭,缓存中的Cookie消失,会话不一定结束,因为服务器端session对象还没有被销毁。这时我们可以通过URL重写机制继承访问session对象。
2. 浏览器没关闭,但是由于长时间没有访问web服务器,服务器判定session超时,将session对象销毁。此时浏览器虽然没有关闭,但是这次会话已经结束。
3. session对象所关联的这个Cookie的name有点特殊,这个name必须是jsessionid全部小写,这时HTTP协议规定的。
4.浏览器禁用了Cookie,可以采用URL重写机制(这样编码的代价比较大,所以一般网站都是不允许禁用Cookie的)
5.怎么重写URL:http://ip:port/webapp/servlet/accessSys;jsessionid=xxxxxx
————————————————
版权声明:本文为CSDN博主「@烟雨倾城ゝ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hcz666/article/details/108916119