1、http的状态管理
(1)http协议的无状态特性
浏览器发送请求给服务器,服务器处理完请求,生成
响应,接下来会立即关闭连接。服务器并不会记录是哪
一个浏览器曾经访问过。也就是说,当该浏览器再一次
发送请求给服务器,服务器不知道该浏览器曾经访问过它。
一般情况下,http协议的无状态特性是一个优势。
因为效率比较高。但是,在一些特定的情况下,就会
有问题:
比如
购物车
在购物车应用当中,用户通过浏览器与服务器之间
有多次的交互,那么服务器必须记录这多次交互的
过程(也就是购物的数据)。默认情况下,http协议
是无状态的,不记录哪一个浏览器曾经访问过它。所以,
必须对http协议进行状态的管理。
(2)如何进行状态管理。
A.采用cookie技术
B.采用session技术
2、cookie技术
(1)什么是cookie?
是一种在客户端(浏览器)维护客户端状态的一种
状态管理技术。
其基本思想是:当浏览器第一次访问
服务器时,服务器会将数据通过设置消息头的方式,
发送给浏览器。浏览器可以将该数据保存到内存或者保存到
硬盘(是一个文本文件)。当浏览器下一次再去访问
服务器时,会将该数据携带(通过设置消息头)给
服务器。服务器就可以知道浏览器上次访问过的信息了。
(2)cookie的使用
A.创建cookie
Cookie c1 = new Cookie(String name,String value);
response.addCookie(c1);
cookie的值只能是ascii字符,对于中文(ascii
字符以外的字符),都需要编码。
URLEncoder.encode()
URLDecoder.decode()
B.读取cookie
Cookie[] cookies = request.getCookies();
如果浏览器发送请求时,没有携带cookie,则
cookies = null。
C.cookie的生存时间
在默认情况下,浏览器会将cookie保存到内存里。
可以设置cookie的生存时间。
Cookie c1 = new Cookie(String name,String value);
c1.setMaxAge(int age);
age > 0 : cookie最长生存时间是多长,
age < 0 : 浏览器会将cookie保存到内存里,
浏览器关闭,cookie会删除。
age = 0: 立即删除
D. cookie的路径问题:
cookie.setPath("/应用名");
表示当前应用名底下的所有组件(jsp,servlet)
都可以访问到该cookie
servlet07
a
saveCookie.jsp
getCookie.jsp
getCookie.jsp
要访问saveCookie.jsp,输入的路径是:
http://localhost:8080/servlet07/a/saveCookie.jsp
此时,相当于设置的cookie的路径是
servlet07/a,此时,只有当前路径以及当前路径以下
的路径可以访问到该cookie。
练习:
1)写一个Servlet,先读取cookie,如果cookie名
为"username"的cookie不存在,则创建一个cookie,
名称为username,值为中文的某个值。如果存在,则
显示。
2)写一个cookie工具
CookieUtil
addCookie(String name,String value,int age,
String path,HttpServletResponse response);
addCookie(String name,String value,String path,
HttpServletResponse response);
//默认时间长度是一年。
//依据cookie name查找cookie值,找不到,返回null
String findCookie(HttpServletRequest request,
String name);
//依据cookie name删除某个cookie
deleteCookie(HttpServletResponse response,
String name);
提示:删除cookie可以参考以下代码,比如要
删除叫name1的cookie:
Cookie c1 = new Cookie("name1","");
c1.setMaxAge(0);
response.addCookie(c1);
以上代码会删除一个叫name1的cookie。
对于path相同的cookie
cookie c1 = new Cookie("c1","v1");
c1.setPath("/abc");
cookie c2 = new Cookie("c1","v2");
c1.setPath("/abc");
response.addCookie(c1);
response.addCookie(c2);
3、Session技术
(1)什么是session
会话
在服务器端维护客户端状态的一种状态管理技术。
其基本思想是:当浏览器访问服务器时,服务器会
创建一个对象(session对象,该对象有一个唯一的
id,也称为session id)。服务器会将该id采用cookie的方式(默认情况下)。
发送给浏览器,浏览器下一次访问服务器时,会将
该id携带给服务器,服务器依据该id找到对应的
session对象。浏览器操作所涉及到的数据可以保存到
session对象里。
(2)session的使用
A.如何获得session?
session只能由服务器创建。
HttpSession session =
request.getSession();
方法一:request.getSession();
方法二:request.getSession(boolean flag);
request.getSession(true):
执行过程:
当请求到达服务器,执行到这行代码,服务器
会查看请求中有无sessionId,若无,则创建一个
session对象。若有,还要看该sessionId所对应
的session对象是否还存在(服务器不会永久
保存一个session对象,sesion对象会有一个
失效时间,对于tomcat,30分钟,超过这个时间,就
会删除)。若不存在,再创建一个新的,否则,
返回原有的那个session对象。
request.getSession(false):
当请求到达服务器,执行到这行代码,服务器
会查看请求中有无sessionId,若无,返回null,
若有,如果sessionId对应的session对象还存在,
则返回该对象,若不存在,返回null。
request.getSession() == request.getSession(true)。
B. 如何存取数据
session.setAttribute(String key,Object value);
注意 value类应用实现序列化接口。
Object session.getAttribute(String key);
session.removeAttribute(String key)
小例子
计数。
C. session的最大不活动时间
session.setMaxInactiveInterval(int seconds);
如果超过该时间,服务器会将session对象删除.
默认情况下,对于tomcat,默认是30分钟。
在conf\web.xml中配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
服务器默认情况下,是通过cookie机制,将
sessionId发送给浏览器,服务器会通过如下
代码:
Cookie c = new Cookie("jsessionId","123");
c.setPath("/appName");
也就是说,浏览器一关闭, 该cookie就会删除,
此时,即使服务器端的session对象还存在,
该对象对浏览器也无意义了。
D. 立即让session对象失效。
session.invalidate()。
FF:在同一台机器上,打开的多个窗口会共享
同一个内存空间。
IE: 一个窗口,对应一块内存空间。