当前位置: 代码迷 >> Web前端 >> java_web 对话之Session技术
  详细解决方案

java_web 对话之Session技术

热度:365   发布时间:2012-11-04 10:42:42.0
java_web 会话之Session技术

保存会话数据的两种技术,第一种已经写了,今天重点写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容器定义。 

<session-config>

<session-timeout>30</session-timeout>

</session-config>

WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

SessionCookie的主要区别在于:

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();

//获取sessionid

HttpSession session = resquest.getSession();

String  value = session.getAttribute(“name”);

out.print(“购买的商品是”+value);

第二种就是

把这两个弄成一个html文件,进行超连接,第一个叫购物。第二个叫结账

有这个一种情况,你购物完之后,获取一个id但是不小心关了,再重新点开,打开结账发现值为空,是不是很纠结;所以解决一下这个问题,

需要在购物内加入一个Cookie来保存这个id到本地;

 创建cookie应该都会了吧,在这里也就不详细介绍了,

首先获取一个sessionid,放到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地址进行重写 

  相关解决方案