Cookie
1.Cookie是什么?Cookie作用?Cookie保存在哪里?
- 翻译过来:曲奇饼干
- Cookie可以保存会话状态,但是这个会话状态是保留在客户端上。
- 只要Cookie清除,或者Cookie失效,这个会话状态就没有了。
- Cookie是保存在浏览器客户端上的。
- Cookie可以保存在浏览器的缓存中,浏览器关闭Cookie消失。
- Cookie也可以保存在客户端的硬盘文件中,浏览器关闭Cookie还在,除非Cookie失效。
2.Cookie只有在javaweb中有吗?
- Cookie不止是在javaweb中存在
- 只要是web开发,只要是B/S架构的系统,只要是基于HTTP协议,就有Cookie的存在。
- Cookie这种机制是HTTP协议规定的。
3、Cookie实现的功能,常见的有哪些?
- 保留购物车商品的状态在客户端上
- 十天内免登录
4、在java中Cookie被当做类来处理,使用new运算符可以创建Cookie对象,而且Cookie由两部分组成,分别是Cookie的name和value,name和value都是字符串类型String
5、在浏览器客户端无论是硬盘文件中还是缓存中保存的Cookie,什么时候会再次发送给服务器呢?
- 浏览器会不会提交发送这些Cookie给服务器,和请求路径有关系
- 请求路径和Cookie是紧密关联的。
- 不同的请求路径会发送提交不同的Cookie
6、默认情况下Cookie会和哪些路径绑定在一起?
/prj-servlet-18/test/createAndSendCookieToBrowser请求服务器,服务器生成Cookie,并将Cookie发送给浏览器客户端,这个浏览器中的Cookie会默认和“test/”这个路径绑定在一起,也就是说,以后只要发送“test/”请求,Cookie一定会提交给服务器。
/prj-servlet-18/a请求服务器,服务器生成Cookie,并将Cookie发送给浏览器客户端,这个浏览器中的Cookie会默认和“prj-servlet-18/”这个路径绑定在一起。也就是说,以后只要发送“prj-servlet-18/”请求,Cookie一定会提交给服务器。
7、默认情况下,没有设置Cookie的有效时长,该Cookie被默认保存在浏览器的缓存当中,只要浏览器不关闭Cookie存在,只要关闭浏览器Cookie消失,我们可以通过设置Cookie的有效时长,以保证Cookie保存在硬盘文件当中。但是这个有效时长必须是>0的。换句话说,只要设置Cookie的有效时长大于0,则该Cookie会被保存在客户端硬盘文件当中,有效时长过去之后,则硬盘文件当中的Cookie失效。
- cookie有效时长=0直接被删除
- cookie有效时长<0不会被存储
- cookie有效时长>0存储在硬盘文件当中
- cookie.setMaxAge(60* 60); 1小时有效
8、浏览器提交Cookie给服务器,服务器怎么接收Cookie?
Cookie[]cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
String cookieName = cookie.getName();
string cookieValue = cookie.getValue();
System.out.println(cookieName + "=" + cookieValue);
}
}
Session
关于web编程中的Session:
1、Session表示会话,不止是在javaweb中存在,只要是web开发,都有会话这种机制。
2、在java中会话对应的类型是: javax.servlet.http.HttpSession,简称session/会话
3、Cookie可以将会话状态保存在客户端,HttpSession可以将会话状态保存在服务器端。
4、HttpSession对象是一个会话级别的对象,一次会话对应一个HttpSession对象。
5、什么是一次会话?
“目前"可以这样理解:用户打开浏览器,在浏览器上发送多次请求,直到最终关闭浏览器,表示一次完整的会话。
6、在会话进行过程中,web服务器一直为当前这个用户维护着一个会话对象/HttpSession
7、在WEB容器中,WEB容器维护了大量的HttpSession对象,换句话说,在WEB容器中应该有一个"session列表"。
思考:为什么当前会话中的每一次请求可以获取到属于自己的会话对象? session的实现原理?
- 打开浏览器,在浏览器上发送首次请求
- 服务器会创建一个HttpSession对象,该对象代表一次会话
- 同时生成HttpSession对象对应的Cookie对象,并且Cookie对象的name是JSESSIONITD,Cookie的value是32位长度的字符串
- 服务器将Cookie的value和HttpSession对象绑定到session列表中
- 服务器将Cookie完整发送给浏览器客户端
- 浏览器客户端将Cookie保存到缓存中
- 只要浏览器不关闭,Cookie不会消失
- 当再次发送请求的时候,会自动提交缓存当中的Cookie
- 服务器接收到Cookie,验证该Cookie的name确实是:JSESSIONID,然后获取该Cookie的value
通过Cookie的value去session列表中检索对应的HttpSession对象。
8、和HttpSession对象关联的这个Cookie的name是比较特殊的,在java中就叫做: jsessionid
9、浏览器禁用Cookie会出现什么问题?怎么解决?
-
浏览器禁用Cookie,则浏览器缓存中不再保存Cookie
-
导致在同一个会话中,无法获取到对应的会话对象
-
禁用Cookie之后,每一次获取的会话对象都是新的
-
浏览器禁用Cookie之后,若还想得到对应的Session对象,必须使用URL重写机制,怎么重写URL:
http://localhost/prj/user/accessySelfSession;jsessionidmD3E9985BC5FD48005018BF2966863E94
重写URL会给编程带来难度/复杂度,所以一般的web站点是不建议禁用Cookie的
10、浏览器关闭之后,服务器端对应的session对象会被销毁吗?为什么?
- 浏览器关闭之后,服务器不会销毁session对象
- 因为B/S架构的系统基于HTTP协议,而HTTP协议是一种无连接/无状态的协议
- 什么是无连接/无状态?
- 请求的瞬间浏览器和服务器之间的通道是打开的,请求响应结束之后,通道关闭
- 这样做的目的是降低服务器的压力
11、 session对象在什么时候被销毁?
- web系统中引入了session超时的概念
- 可配置:web. xml文件中,默认是30分钟
< session-config>
< session-timeout>120< /session-timeout>
</ session-config> - 当很长一段时间(这个时间可以配置)没有用户再访问该session对象,此时session对象超时,web服务器自动回收session对象。
12、什么是一次会话呢?
- 多数情况下,是这样描述的:用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。
- 本质上的描述:从session对象的创建,到最终session对象超时之后销毁,这个才是真正意义的一次完整会话。
13、关于javax. servlet.http.HttpSession接口中常用方法:
void setAttribute(String name,object value)
object getAttribute(string name)
void removeAttribute(string name)
void invalidate()
销毁session对象
14、ServletContext、HttpSession、HttpServletRequest接口的对比:
① 以上都是范围对象:
- ServletContext application; 是应用范围
- HttpSession session; 是会话范围
- HttpServletRequest request; 是请求范围
② 三个范围的排序:
-
application > session > request
-
application完成跨会话共享数据;
-
session完成跨请求传递数据,但是这些请求必须在同一个会话当中
-
request完成跨Servlet共享数据,但是这些Servlet必须在同一个请求当中【转发】
③ 使用原则:由小到大尝试,优先使用小范围。
- 例如:登录成功之后,已经登录的状态需要保存起来,可以将登录成功的这个状态保存到session对象中。登录成功状态不能保存到request范围中,因为一次请求对应一个新的request对象。登录成功状态也不能保存到application范围中,因为登录成功状态是属于会话级别的,不能所有用户共享。
15、补充HttpServletRequest中的方法:
- HttpSession session = request.getSession();获取当前的session,获取不到,则新建session
- HttpSession session = request.getSession(true);获取当前的session,获取不到,则新建session
- HttpSession session = request.getSession(false);获取当前的session,获取不到,则返回null