目录
1.会话跟踪&HTTP无状态协议.
1.1会话跟踪.
1.2HTTP无状态协议.
2.Cookie.
2.1何为Cookie.
2.2Cookie的有效期.
2.3案例讲解.
3.session.
3.1何为session.
3.2session的生命周期.
3.3session的有效期.
3.4session共享问题.
3.5常用方法.
3.6禁用session.
3.7课堂讲解流程.
3.7.1用session保存用户名.
3.7.2用session做登陆验证.
3.7.3验证session失效时间.
3.7.4手动注销session.
4.session和Cookie的区别.
1.会话跟踪&HTTP无状态协议.
1.1会话跟踪.
-
会话即session,会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与session。Cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。
-
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
1.2HTTP无状态协议.
-
Web应用程序是使用HTTP协议传输数据的,而HTTP协议是无状态的协议,服务器单从网络连接上无从知道客户身份,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
-
例如,用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的还是用户B的。
-
要跟踪该会话,必须引入一种机制,而 Cookie 和 session就是这样一种机制。
2.Cookie.
2.1何为Cookie.
-
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Google、Firefox等都支持Cookie。
-
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
-
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
-
浏览器会在电脑本地磁盘目录里面以记事本形式保存Cookie信息,一个记事本保存一个Cookie。
-
浏览器保存 Cookie的原理如下所示:
-
Cookie功能需要浏览器的支持,如果浏览器不支持Cookie 或者把Cookie禁用了,Cookie功能就会失效,不同的浏览器采用不同的方式保存Cookie。
2.2Cookie的有效期.
-
Cookie的 maxAge 属性决定着Cookie的有效期,单位为秒,cookie默认有效期为 -1秒,关闭浏览器 cookie里面的数据就消失,和 session效果一样;
-
Cookie 通过 getMaxAge() 方法与 setMaxAge(int maxAge) 方法来读写 maxAge属性:
-
如果 maxAge 属性值为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在设定的时间之内,登录网站时该Cookie仍然有效。
-
如果将 maxAge 属性值设为 MAX_VALUE,那么 Cookie信息将永久有效,如:
-
-
-
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。
-
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,如:
-
-
response对象提供的Cookie操作方法只有一个添加操作:add(Cookie cookie)。
-
要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
-
注意:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。
2.3案例讲解.
-
页面准备:登陆页面 → 登陆成功数据处理 → 登陆成功页面 → 点击修改按钮 → 修改页面;
2.3.1用cookie做登陆状态验证.
-
第一步:在登陆数据处理页面/servlet,将用户名保存到 cookie里面,并将 cookie添加到 response里面,必须通过重定向跳转到下个页面;
-
第二步:将通过 cookie验证登陆状态的代码写到一个jsp页面,如:
2.3.2验证cookie是将数据保存到客户端及有效期.
-
cookie是将数据保存到客户端,我们来验证下这一点:
-
在登陆数据处理页面/servlet将用户名保存到 cookie里面;
-
操作一遍登陆功能,关闭浏览器;
-
直接访问后台 admin.jsp页面,访问不了,跳转到登陆页面,这是因为我们刚刚讲登陆的用户名保存到 cookie里面之后,没有设置 cookie的有效期。而cookie默认的有效期是 -1秒,和session作用一样,浏览器关闭,cookie里面的数据就消失,所以需要重新登陆;
-
在登陆数据处理页面设置 cookie的有效期为1分钟,执行一遍登陆功能,关闭浏览器;
-
直接后台 admin.jsp页面,发现可以访问,从这一点就证明了 cookie是将数据保存到客户端;
-
等 1分钟过后,再次访问 后台 admin.jsp页面,发现跳转到登陆页面,这是因为我们设定的 cookie有效期已过,cookie里面的数据已经消失,需要重新登陆。
-
2.3.2用cookie做注销.
-
在jsp页面写注销 cookie的代码,如:
-
-
然后再登陆成功页面添加:<a href="cookieOut.jsp">注销</a>。
-
2.3.3用cookie实现自动登陆.
-
效果:登陆一次后,在设定的有效期内,再次访问登陆页面会直接跳转到登陆成功页面;
-
思路:
-
在登陆页面添加一个复选框,用来进行勾选是否自动登陆。如:<input type="checkbox" value=”1” name=”ck”/>自动登录一天;
-
登陆数据处理页面,先获取登陆页面复选框的value值,如果获取的是 null,则表示用户没勾选 "自动登陆",如果不为null,那么就表示用户勾选了 "自动登录",就将用户名保存到 cookie里面,并设置 cookie的有效期。如:cook.setMaxAge(60*30);//60秒*30,也就是30分钟
-
然后将 cookie对象输出到客户端;
-
在登陆页面顶部做判断,如果 cookie里面有用户名,则直接跳转到登陆成功后的页面。如:
-
2.3.4用cookie实现记住密码功能.
-
首先在登录数据处理页面/servlet里面,判断用户勾选了 "记住密码"功能后,将账号和密码分别保存到两个不同的 cookie对象里面,并且设置这两个 cookie对象的有效时间,然后将这两个 cookie对象输出到客户端。
-
在登录页面的处理和自动登陆功能很相似,在登陆页面顶部进行判断,将 cookie里面保存的账号和密码取出来赋给登陆页面的账号和密码文本框,不用页面跳转。代码如下:
-
注意,可以不用对 cookie数组进行非空判断,因为 Tomcat服务启动会默认创建一个 cookie。
3.session.
3.1何为session.
-
除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力(Session 技术是依赖 Cookie 技术的 服务器端的数据存储技术)。
-
session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上,在一次会话的多次请求间共享数据,将数据保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
-
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
-
session可以存储任意类型,任意大小的数据(没有大小限制)。
3.2session的生命周期.
-
session将数据保存在服务器端。为了获得更高的存取速度,服务器一般把 session放在内存里。每个用户都会有一个独立的ession。如果session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,session里的信息应该尽量精简。
-
当多个客户端执行程序时,服务器会保存多个客户端的session。获取Session的时候也不需要声明获取谁的c。session机制决定了当前客户只会获取到自己的session,而不会获取到别人的session。各客户的session也彼此独立,互不可见。
-
session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建session,只访问html、image等静态资源并不会创建session。如果尚未生成s,也可以使用request.getSession(true)强制生成 session。
-
session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该session。用户每访问服务器一次,无论是否读写session,服务器都认为该用户的 session "活跃(active)" 了一次。
-
提示:session的使用比Cookie方便,但是过多的session存储在服务器内存中,会对服务器造成压力。
3.3session的有效期.
-
session默认有效时间是 30 分钟,超过sessoin有效期,那么session里面保存的数据就会自动消失;
-
session在服务器关闭的时候自动销毁,手动销毁 session,调用 session对象的 invalidate()方法。注意,session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送任何请求来关闭Session,自然Session也不会被销毁,需要手动调用销毁 session的方法。
-
由于会有越来越多的用户访问服务器,因此session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的session从内存删除。这个时间就是session的有效时间,如果超过了有效时间没访问过服务器,session就自动失效了,session默认时间是30分钟。
-
设置session的有效时间属性为 maxInactiveInterval 属性,可以通过对应的 getMaxInactiveInterval() 获取,通过 setMaxInactiveInterval(时间/秒) 修改。
-
session的有效时间也可以在web.xml中修改,如:
3.4session共享问题.
-
原则上打开一个不同浏览器或同一个浏览器的选项卡代表创建一个新的会话,一个新的 session,但是经测试发现会共享同一个 session;
-
当所有浏览器都关闭之后,再访问项目,就会产生一个新的 session;
-
以上两点可以通过在登录成功后打印 session对象或者打印sessionid(session对象调用getId()方法)进行测试验证。
3.5常用方法.
-
补充方法:
-
request.getSession():
-
Servlet 里通过 request.getSession()方法获取该客户的 session。
-
-
getSession(boolean create):
-
request还可以使用getSession(boolean create)来获取session。区别是如果该客户的session不存在,request.getSession()方法会返回null,而getSession(true)会先创建session再将session返回。
-
-
removeAttribute(String attribute):
-
移除session属性。
-
-
long getCreationTime():
-
返回session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())。
-
-
long getLastAccessedTime():
-
返回session的最后活跃时间。返回类型为long。
-
-
boolean isNew():
-
返回该session是否是新创建的。
-
-
String getId():
-
返回session的ID,该ID由服务器自动创建,不会重复。
-
-
用session保存登录时间:
session.setAttribute("loginTime", new Date());
3.6禁用session.
-
我们也可以在 jsp页面禁用 session,在 jsp页面顶部的 page指令里面添加:session="false" 即可,默认是开启 session。
-
为什么要禁用session?因为 tomcat会为每个请求创建一个 session,哪怕session里面没有存数据,也会默认占1.5kb的服务器内存,久而久之,势必会对服务器造成很大压力,所以在不需要 session的 jsp页面里面就要禁用 session。
3.7课堂讲解流程.
-
页面准备:登陆页面 → 登陆成功数据处理 → 登陆成功页面 → 点击修改按钮 → 修改页面;
3.7.1用session保存用户名.
-
在登陆数据处理页面/servlet,将用户名保存到 session里面,在登陆成功页面和修改页面绑定用户名;
3.7.2用session做登陆验证.
-
第一步:在登陆数据处理页面/servlet,将用户名保存到 session里面;
-
第二步:在登陆成功页面和修改页面顶部:获取 session里面的用户名,然后通过if判断,如果为空,则跳回到登陆页面。然后不登陆,直接访问登陆成功页面或者修改页面,会提示 "请先登录",并且跳回到登陆页面;
-
第三步:优化,将登陆状态验证的代码写到一个 jsp页面,然后在需要做验证的页面顶部通过 <%@ include %>指令引入该页面。
3.7.3验证session失效时间.
-
第一步:在登陆数据处理页面/servlet,将用户名保存到 session里面,在登陆成功页面和修改页面绑定用户名;
-
第二步:登陆数据处理页面/servlet,将用户名保存到 session里面,并且设置session的有效期为 5秒,登陆成功后在登陆成功页面停留5秒钟,然后点击修改,然后提示 "请先登陆",并且跳回到登陆页面。这是因为达到 session失效时间后,session里面的用户名数据消失,修改页面做了登陆验证判断出 session里面没有用户名,所以就跳回到登陆页面。
3.7.4手动注销session.
-
编写一个注销session页面:sessionOut.jsp,里面添加注销 session代码:session.invalidate(); 并且跳转到登陆页面。
-
在登陆成功页面添加:<a href="sessionOut.jsp">注销</a>,然后点击注销,成功实现 session注销功能。
4.session和Cookie的区别.
-
cookie数据存放在客户的浏览器上,session数据放在服务器上。
-
简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送 当前会话的session_id,服务器根据当前session_id判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id,用特殊的浏览器伪造该用户的请求也是能够成功的。
-
session_id是服务器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。
-
session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的sessionID,用该sessionID 为标识符来存取服务器端的session存储空间。而sessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么session也会失效。
-
-
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
-
设置cookie时间可以使cookie过期,使用session.destory(),将会销毁会话。
-
session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
-
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型。
-
注意:
-
session很容易失效,用户体验很差;
-
虽然cookie不安全,但是可以加密 ;
-
cookie也分为永久和暂时存在的;
-
浏览器有禁止cookie功能,但一般用户都不会设置。
-