学习笔记
参考动力节点JavaWeb教程
**
Cookie
**是一种进行网络会话状态跟踪的技术(属于Web开发技术)。会话是由一组请求与响应组成,是围绕一件相关事情所进行的请求与响应,所以这些请求与响应之间一定是需要有数据传递的,而http协议是一种无状态协议,在不同请求间不能完成数据传递,所以需要这种会话状态跟踪技术。
Cookie是由服务器生成(将其封装在响应头中,以响应的形式发送给客户端),保存在客户端的一种信息载体,这个载体中存放着用户访问该站点的会话状态信息,只要cookie没被清除,或没失效,保存的会话状态信息就会一直有效,当客户端再次发送同类请求时,请求会携带保存的Cookie数据,发送到服务器,由服务器对会话进行跟踪。
Cookie是由若干键值对构成,这里的键一般称为name,值为value。Cookie中的键值对均为字符串。
**
有关Cookie的方法:
**
//创建Cookie,调用Cookie的带参构造器
Cookie cookie=new Cookie("address","shanghai");
//指定Cookie绑定的路径。(该路径必须要添加上项目名称)
cookie.setPath(request.getContextPath()+"/aaa/bb/ccc");
//设置Cookie的有效期,该值为整型值,单位为秒
cookie.setMaxAge(60*60);//该值大于0,表示将Cookie存放到客户端的硬盘;小于0,与不设置效果相同,会将Cookie存放到浏览器的缓存;等于0,表示Cookie医生称便失效。
//向响应中添加Cookie
response.setCookie(cookie);
**
Session
**
是Web开发中的一种会话状态跟踪技术。与Cookie的不同之处,Cookie是将会话状态保存在了客户端,而Session是将会话状态保存到了服务器端。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象形式出现的。
**
会话:当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
**
**
有关Session的用法:
**
/*
对于request的getSession()的用法:
一般情况下,若想session中写入数据,需使用个体Session(true),即getSession()方法。
意义:有老的用老的,没老的建新的。
若要从Session中读取数据,则要使用getSession(false)。
意义:有老的用老的,没老的返回null
*/
**
Session的工作原理
**
(1)写入Session列表
服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为列表,该Map的key为一个32位长度的随机串,这个随机串称为JSessionID,value则为Session对象的引用。
当第一次提交请求时,服务端servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。
(2)服务器生成并发送Cookie
在将Session信息写入到Session 列表后,系统还会自动将“JSessionID”作为name,这个32位长度的随机串作为value,以Cookie的形式存放到响应头中,并随着响应,将该Cookie发送到客户端。
(3)客户端接收并发送Cookie
客户端接收到这个Cookie后会将存放到浏览器的缓存中。当用户端提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务器。
Session失效是指某个Session在指定时间内一直没有被访问,超时后就会失效。
在web.xml中可以通过<session-config标签设置Session的超时时间(单位分钟),默认为30分钟,该时间指从最后一次被访问开始计时,在指定时长内一直未被访问的时长。
<!--设置Session的失效时间-->
<session-config>
<session-timeout>60<session-timeout>
</session-config>
//使Session失效,但失效的Session并不为null
session.invalidate();
A,解决Cookie禁用后(不禁也能用),Session的跟踪问题
比如:从SomeServlet.java重定向跳转到OtherServlet.java时:
String uri=request.getContextPath()+"/otherServlet";
uri=response.encodeRedirectURL(uri);//将重新编码后的uri给uri
response.sendRedirect(uri);
但该种方式会重写URL,会将JSessionID写到地址栏,不安全
B,解决Cookie禁用后,非重定向时的Session跟踪问题
比如:从SomeServlet.java通过标准输出流输出的超链接跳转到OtherServlet.java时:
response.setContentType("text/html;charset=utf-8");
//获取标准输出流
PrintWriter out=response.getWriter();
String uri="otherServlet";
uri=response.encodeURL(uri);
//向标准输出流写数据,会在浏览器显示
out.print("<a href='"+uri+"'>跳转</a>到otherServlet");
该方式也会将JSessionID写到地址栏,不安全。
所以会规定想访问站点必须打开Cookie,保证安全。