会话管理
一.会话技术概念
会话技术:浏览器开始访问网站到访问网站结束期间产生的多次请求响应组合在一起叫做一次会话。会话的过程中会产生会话相关的数据,我们需要将这些数据保存起来。保存的技术大抵分为两种:Cookie(客户端技术)和Session(服务器端技术)。
二.Cookie和Session概念
Cookie:Cookie是客户端技术,程序把每个用户的数据以Cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,Web资源处理的就是用户各自的数据了。
Session:Session是服务器端技术。利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的Session对象。由于Session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的Session中。当用户再去访问服务器中的其它Web资源时,其它Web资源再从用户各自的Session中取出数据为用户服务。
三.Cookie(name+value)
1.获取所有的Cookie并组成组(名字+值):
request.getCookies();
2.添加Cookie(名字+值):
response.addCookie(Cookie c);
3.Cookie的构造(造的时候就需要设定好cookie的名字和值):
new Cookie(String name,String value)
4.获取Cookie名称:
getName();
5.获取Cookie的值:
getValue();
6.设置Cookie的值:
setValue
7.设置Cookie的最大留存时间和获取Cookie的留存时间:
setMaxAge与getMaxAge
8.通知浏览器在访问服务器中的哪个路径及其子路径时会获取当前cookie
setPath与getPath
9.通知浏览器在访问哪个域名的时候带着当前的cookie信息(一般不使用)
setDomain与getDomain
实例:显示用户上次访问的时间
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//解决中文乱码
response.setContentType("text/html;charset=utf-8");
//获取所有的Cookie并组成组(名字+值)
Cookie [] cs = request.getCookies();
Cookie findC = null;
if(cs!=null){
for(Cookie c : cs){
//获取Cookie名称
if("lastTime".equals(c.getName())){
findC = c;
}
}
}
if(findC == null){
response.getWriter().write("您是第一次访问本网站!");
}else{
//获取Cookie的值
Long lastTime = Long.parseLong(findC.getValue());
response.getWriter().write("您上次访问时间是:"+new Date(lastTime).toLocaleString());
}
Date date = new Date();
//构造Cookie(名字+值)
Cookie c = new Cookie("lastTime",date.getTime()+"");
//设置Cookie留存的最大时间
c.setMaxAge(3600*24*30);
//设置会设置Cookie的访问路径
c.setPath(request.getContextPath());
//c.setDomain(".baidu.com");
//添加
response.addCookie(c);
}
Tips:
1.一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
2.删除Cookie时,path必须一致,否则不会删除(浏览器通过Cookie的name+path来标识一个Cookie).
3.如果创建了一个Cookie,并将他发送到浏览器,默认情况下它是一个会话级别的Cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该Cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
四.Session(name+value)
1.作用范围和保留时间
作用范围:当前会话
保留时间:Session不会因为浏览器关闭而马上销毁,会保留一段时间
2.Session和Jsessionid
浏览器第一次向客户端发送请求时,服务器会自动生成一个Session和Jsessionid,Jsessionid唯一标识这个Session
3.Session的原理
1)request.getSession()方法会检查请求中有没有Jsessionid的 Cookie,如果有拿出他的值找到对应的Session为他服务.
2)如果没有则检查请求的URL后有没有以参数的形式带着Jsessionid过来,如果有则找到对应的Session为浏览器服务。
3)如果还找不到则认为这个浏览器没有对应的Session,创建一个Session然后再在响应中添加Jsessionid Cookie,这个Jsessionid的值就是这个Session 的id。
4)默认情况下,Jsessionid 的path为当前web应用的名称,并且没有设置过MaxAge,是一个会话级别的Cookie。
这意味着一旦关闭浏览器再新开浏览器时,由于Jsessionid丢失,会找不到之前的Session。
我们可以手动的发送代表Jsessionid的Cookie,名字和path设置的和自动发送时一样,但是设置一下MaxAge,使浏览器除了在内存中保存Jsessionid信息以外还在临时文件夹中以文件的形式保存,这样即使重开浏览器仍然可以使用之前的Session
3.创建Session的id
request.getSession()
HttpSession session = request.getSession()
4.储存Session的值
session.setAttribute("name", "zhang");
5.获取Session的值
session.getAttribute("xxx")
6.获取Session的id
session.getid
7.URL重写(浏览器禁用Cookie后的解决方法)
response. encodeRedirectURL(java.lang.String url)··· 如果有重定向,就用这个方法
response. encodeURL(java.lang.String url)
Tip:
URl重写的方法一旦发现浏览器带回了任意Cookie信息,则认为客户端没有禁用Cookie,就不会再进行重写操作
实例1:关掉浏览器,重开,原来的Session还在
Session的id是名为Jsessionid的Cookie保存的,默认为会话级Cookie,所以我们可以自己来创造名为Jsessionid的Cookie,然后设置Maxage来使它可以在浏览器被关掉后还可以存在,最后,关掉浏览器,然后重开,getSession方法会找到我们设置了Maxage的Jsessionid的id,从而找到对应的Session来完成操作。
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String prod = request.getParameter("prod");
prod = new String(prod.getBytes("iso8859-1"),"utf-8");
HttpSession session = request.getSession();
Cookie jc = new Cookie("JSESSIONID",session.getId());
jc.setPath(request.getContextPath());
jc.setMaxAge(1800);
response.addCookie(jc);
session.setAttribute("prod", prod);
}
实例2:当Session和Cookie被禁用时如何使用Session(服务器创建了Session但浏览器中无法保存)
客户点击商品,形成的URl中带prod和Session,然后,在BuyServlet中,通过getSession方法,获取URL中的Session的id,然后将prod的值赋给Session,最后,PayServlet通过getSession方法获取URL的Session的id,取出对应Session中的prod,完成操作。
BuyServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String prod = request.getParameter("prod");
prod = new String(prod.getBytes("iso8859-1"),"utf-8");
HttpSession session = request.getSession();
session.setAttribute("prod", prod);
}
PayServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
String prod = (String) session.getAttribute("prod");
response.getWriter().write("您购买的是"+prod+"价值99999999999元");
}
JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%>
<%
//URL重写
request.getSession();
String url1 = request.getContextPath()+"/servlet/BuyServlet?prod=电视机";
url1 = response.encodeURL(url1);
String url2 = request.getContextPath()+"/servlet/BuyServlet?prod=冰箱";
url2 = response.encodeURL(url2);
String url3 = request.getContextPath()+"/servlet/PayServlet";
url3 = response.encodeURL(url3);
%>
电视机
冰箱
结账
五.Session和Cookie的对比
Cookie:
1)Cookie是客户端技术
2)数据保存在客户端,这个信息可以保存很长时间
3)数据随时有可能被清空,所以Cookie保存的数据是不太靠谱的
4)数据被保存在了客户端,随时有可能被人看走,可能有安全问题
Session:
1)Session是服务器端技术
2)数据保存在服务区端,相对来说比较稳定和安全
3)占用服务器内存,所以一般存活的时间不会太长,超过超时时间就会被销毁.我们要根据服务器的压力和Session 的使用情况合理设置Session的超时时间,既能保证Session的存活时间够用,同时不用的Session可以及时销毁减少对服务器内存的占用.