保存会话数据的两种技术,第一种已经写了,今天重点写
Session
技术;
Cookie
Cookie
是客户端技术,服务器把每个用户的数据以
cookie
的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的
web
资源时,就会带着各自的数据去。这样,
web
资源处理的就是用户各自的数据了。
Session
Session
是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的
session
对象,由于
session
为用户浏览器独享,所以用户在访问服务器的
web
资源时,可以把各自的数据放在各自的
session
中,当用户再去访问服务器中的其它
web
资源时,其它
web
资源再从用户各自的
session
中取出数据为用户服务。
首先了解一下什么是Session
技术:
使用
Cookie
和附加
URL
参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。
Session
技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
客户端需要接收、记忆和回送
Session
的会话标识号,
Session
可以且通常是借助
Cookie
来传递会话标识号
Session
的跟踪机制 :
Servlet API
规范中定义了一个
HttpSession
接口,
HttpSession
接口定义了各种管理和操作会话状态的方法。
HttpSession
对象是保持会话状态信息的存储结构,一个客户端在
WEB
服务器端对应一个各自的
HttpSession
对象。
WEB
服务器并不会在客户端开始访问它时就创建
HttpSession
对象,只有客户端访问某个能与客户端开启会话的
Servlet
程序时,
WEB
应用程序才会创建一个与该客户端对应的
HttpSession
对象。
WEB
服务器为
HttpSession
对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给
WEB
服务器,
WEB
服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的
HttpSession
对象。
WEB
应用程序创建了与某个客户端对应的
HttpSession
对象后,只要没有超出一个限定的空闲时间段,
HttpSession
对象就驻留在
WEB
服务器内存之中,该客户端此后访问任意的
Servlet
程序时,它们都使用与客户端对应的那个已存在的
HttpSession
对象。
HttpSession
接口中专门定义了一个
setAttribute
方法来将对象存储到
HttpSession
对象中,还定义了一个
getAttribute
方法来检索存储在
HttpSession
对象中的对象,存储进
HttpSession
对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
Session
是实现网上商城的购物车的最佳方案,存储在某个客户
Session
中的一个集合对象就可充当该客户的一个购物车。
Session
的超时管理
WEB
服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,
WEB
服务器还要保留与之对应的
HttpSession
对象。
随着时间的推移而不断增加新的访问客户端,
WEB
服务器内存中将会因此积累起大量的不再被使用的
HttpSession
对象,并将最终导致服务器内存耗尽。
WEB
服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,
WEB
服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的
HttpSession
对象变成垃圾。
如果客户端浏览器超时后再次发出访问请求,
WEB
服务器则认为这是一个新的会话的开始,将为之创建新的
HttpSession
对象和分配新的会话标识号。
会话的超时间隔可以在
web.xml
文件中设置,其默认值由
Servlet
容器定义。
30
在
WEB
开发中,服务器可以为每个用户浏览器创建一个会话对象(
session
对象),注意:一个浏览器独占一个
session
对象
(
默认情况下
)
。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的
session
中,当用户使用浏览器访问其它程序时,其它程序可以从用户的
session
中取出该用户的数据,为用户服务。
Session
和
Cookie
的主要区别在于:
Cookie
是把用户的数据写给用户的浏览器。
Session
技术把用户的数据写到用户独占的
session
中。
Session
对象由服务器创建,开发人员可以调用
request
对象的
getSession
方法得到
session
对象。
今天讲的总的可以归为三点:
第一个就是
首先是
request.getSession();
方法,如果是第一次获取,原先没有
Session
技术;服务器会自动向浏览器返回一个
id;
HttpSession session=request.getSession();//
可以带参数,如果是
true
代表没有自动创建,
false
代表没有也不创建;
session.setAttribute(“name”,”nameValue”);//
为
session
属性赋值;
然后在创建一个
Servlet
类,来获取
session
的值;
首先解决乱码问题;
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
//
获取
session
的
id
HttpSession session = resquest.getSession();
String value = session.getAttribute(“name”);
out.print(“购买的商品是”+value);
第二种就是
把这两个弄成一个
html
文件,进行超连接,第一个叫购物。第二个叫结账
有这个一种情况,你购物完之后,获取一个
id
但是不小心关了,再重新点开,打开结账发现值为空,是不是很纠结;所以解决一下这个问题,
需要在购物内加入一个
Cookie
来保存这个
id
到本地;
创建
cookie
应该都会了吧,在这里也就不详细介绍了,
首先获取一个
session
的
id
,放到
cookie
里保存;
String id = session.getID();
Cookie cookie = new Cookie(“JESSIONID”,id);//
参数值与
session
一致
cookie.setMaxAge(30*60);//
与浏览器保存时间一致;
response.addCookie(cookie);
第三种就是用户把浏览器的
Cookie
设置关闭,导致
cookie
无法使用;
这个需要使用
URL
重写;
IE
禁用
Cookie
后的
session
处理
解决方案:
URL
重写
response. encodeRedirectURL(java.lang.String url)
用于对
sendRedirect
方法后的
url
地址进行重写。
response. encodeURL(java.lang.String url)
用于对表单
action
和超链接的
url
地址进行重写