cookie和session技术原理总结
cookie技术:
1 作用:解决了发送不同请求的数据共享问题
2 使用:
2.1 创建cookie对象:cookie c=new cookie(String name ,String value)
2.2 响应cookie信息给客户端(浏览器),response.addcookie(cookie cookie)
2.3 获取cookie,拿到数据 Cookie[] request.getcookies()
实现原理:基于响应头set-cookie和请求头cookie实现
注意: 一个cookie对象储存一条数据,多条数据,可以多创几个cookie对象进行存储
3 存储方式:
(1)临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
(2)定时存储:设置了cookie的有效期(cookie.setMaxAge(int seconds)),存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息,默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径(cookie.setpath(“路径”))
4 获取cookie信息:req.getcookies(),返回一个cookie类型的数组
5 cookie细节:
1 一次可不可以发送多个cookie?
可以创建多个cookie对象,使用response调用多次addcookie方法发送cookie即可
2 cookie在浏览器中保存多长时间?
1默认情况下,当浏览器关闭后,cookie数据被销毁
2持久化存储:
*SetMaxAge(int seconds)
a. 正数:将cookie数据写到硬盘的文件中,持久化存储,cookie存活时间
b. 负数:默认值
c. 零:删除cookie信息
3 cookie能不能存中文?
*在Tomcat8之前cookie中不能直接存储中文数据
需要将中文数据转码,一般采用URL编码
*在Tomcat8之后,cookie支持中文数据
4 cookie的共享问题?
1. 假设在一个Tomcat服务器中,部署了多个web项目,那么这些项目中的cookie能不能共享?
*默认情况下cookie不能共享
*setPath(String path):设置cookie的共享范围。默认情况下,设置当前的虚拟目录(如果共享,则可以将path设置为“/”)
2. 不同的Tomcat服务器间cookie共享问题?
*setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
* setDomain(“.baidu.com”),那么tieba,baidu.com和new.baidu.com中cookie可以共享
特点:浏览器端的数据存储技术
存储的数据声明在服务器端
浏览器对于单个cookie的大小有限制(4kb)(不同浏览器大小不同)以及对同一个域名下的总cookie数量也有限制(20个)(不同浏览器不同)
Cookie一般存储少量不太敏感的数据
session技术:
11 session技术是依赖cookie技术的服务器端的数据存储技术,存储在服务器端,由服务器创建,每个用户独立拥有一个session,默认存储时间30分钟
2 作用:解决一个用户的不同请求处理的数据共享问题
3 原理:session是依赖于cookie的,用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的sessionid使用cookie技术储存到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据
4 使用:
4.1创建session对象(获取session对象)
1. HttpSession hs=req.getSession();
4.2 使用httpSession对象:
1 object getAttribute(String name)
2 void setAttribute(string name,object value)
3 void removeAttribute(string name)
4.3
如果请求中有sessionid,则返回对应的session对象
如果请求中没有sessionid,则创建新的session对象,并将其sessionid作为cookie数据存储到浏览器的内存中
如果sessionid失效了,会重新创建一个session对象,并将其sessionid存储在浏览器内存中
4.2 设置session存储时间
hs.setMaxInactiveInterval()
4.3 设置session强制失效:hs.invalidate()
4.4 存储和获取数据
4.4.1 存储:hs.setAttribute(String name,Object value);
4.4.2 获取:hs.getAttribute(String name),返回Object类型的数据
4.5 作用域:一次会话(在jsession和session对象不失效的情况下为整个项目内)
细节: 1 当客户端关闭后,服务器关闭,两次获取session是否为同一个
* 默认情况下不是
* 如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
Cookie c=new cookie(“JSESSIONID”,session.getid())
c.setMaxAge()
response.addcookie(c)
2 客户端不关闭,服务端关闭后,两次获取的session是同一个吗?
* 不是同一个,但是要确保数据不丢失:
a. session钝化:
在服务器关闭之前,将session对象系列化到硬盘上
b. session的活化:
在服务器启动之后,将session文件转化为内存中的session对象即可
3 session的失效时间?
1服务器关闭
2 session对象调用invalidate()
3 session默认失效时间(一般为30分钟)
选择性配置修改(在Tomcat的web.xml文件中)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4 session的特点
- 1. session用于存储一次会话的多次请求的数据,存在服务器端
- 2. session可以存储任意类型,任意大小的数据
5 注意:
(1)sessionid存储在了cookie的临时存储空间中,浏览器关闭即失效
(2)如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也 是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
请求servlet不会自动产生sessionid,请求jsp会自动产生session(原因是index.jsp的Java源代码代码中,自动获取了session)
浙公网安备 33010602011771号