存储客户端的状态
京东商城在没有登陆的情况下依然可以将商品加入购物车,那么这个购物车的数据存储到哪里呢?肯定不是request,因为如果是它的话,每加入一件,再去访问其它商品,在加入一件,上一次商品就没有了,因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,在未登录的情况下,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态
会话技术cookie和Session
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookieSession:将数据存储到服务器端,安全性相对好,增加服务器的压力
cookie技术详解
创建cookie
cookie cookie = new cookie(String cookieName,String cookievalue);
参数为cookie的名称和cookie的值,举例:cookie cookie = new cookie("username","zhangsan");
那么创建了一个cookie,并且向cookie中写入了数据username=zhangsan,注意cookie中不能写入中文,也就是说后面的验证码效验,如果是中文验证码,则不能用cookie
如果我们将这个cookie向客户端发送,那么相应头的形式是这样的
设置cookie在客户端的持久化时间
cookie.setMaxAge(int seconds);seconds为秒
cookie默认的生命周期是一个会话,就是说只要浏览器关系,他就没有了,如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,设置多久时间,他就会存在多长时间
举例:
设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息cookie.setMaxAge(10*60);
设置cookie的携带路径
如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息,比如/aa/servlet的这个路径的servlet产生了cookie,那么只有在访问WWW/aa下的资源的时候才会带cookie,如果访问WWW/a.jsp则不会带cookie,因为他不是aa目录下的
示例:
cookie.setPath("/WEB16");代表访问WEB16应用中的任何资源都携带cookiecookie.setPath("/WEB16/cookieServlet");代表访问WEB16中的cookieServlet时才携带cookie信息cookie.setPath("/");访问服务器下的所有应用都携带这个cookie
向客户端发送cookie:
response.addcookie(cookie cookie);创建完成之后,只有发送才能到答响应体
删除客户端的cookie:
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可
new相同name值的cookie,值无所谓(new相同的name的cookie会把前面相同name的覆盖)设置相同的setpath,最好设置最大Age为0,才删除,必须全部一样然后response.Add(这个cookie)向响应头增加一个set-cookie字段
第一次浏览器访问网站因为没有cookie,所以请求行没有cookie,假如他访问的servlet,new了一个cookie,并且response。add这个cookie,那么下次浏览器在访问这个网站资源(如果setpath合适的话),他会在请求头中带上这个cookie
那么我们此时可以通过request获取这个cookie,并且解析里面的值
1)通过request获得所有的cookie:(只能获取所有)cookie[] cookies = request.getcookies();2)遍历cookie数组,通过cookie的名称获得我们想要的cookiefor(cookie cookie : cookies){if(cookie.getName().equal(cookieName)){String cookievalue = cookie.getValue();}}
一个cookie创建的时候只能添加一个键值对,一个web站点可以给web浏览器发送多个cookie,一个浏览器也可以存储多个cookie,一般允许存放300个cookie,每个网站允许存放20个
Session技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间(session)这个它自动操作,不用我们关心。这个JSESSIONID是在cookie中存储,所以说Session的实现是基于cookie,Session需要借助于cookie存储客户的唯一性标识JSESSIONID,JSESSIONID被清了之后(cookie被删),即使session还存在,但是因为cookie存储的JSESSIONID不在了,也找不到这个Session了
cookie创建,之后,需要手动的response.addcookie,而session不用,只要创建之后,服务器会自动的将其放到了服务器端了。
1.获得Session对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回,这个方法实质就是它会先获取cookie中的JSESSIONID,如果没有获取到则直接创建session,如果获取到JSESSIONID,则去找对应的session,如果有则获取session对象,如果没有则创建。
HttpSession session = request.getSession(false);//有就获取,没有不创建
如果cookie被清的话,虽然session还存在,但是当我们request.getSession();的时候因为JSESSIONID没有了,所以还是会创建一个新的session,并产生一个新的JSESSIONID
当我们有session对象的时候可以通过session.Getid()的方式来获取JSESSIONID
向session中存取数据(session也是一个域对象)
session.setAttribute(String name,Object obj);session.getAttribute(String name);session.removeAttribute(String name);
Session对象的生命周期
创建:第一次执行request.getSession()时创建
销毁:服务器(非正常)关闭时或session过期/失效(默认30分钟)
30分钟是从什么时候开始算呢?从不操作服务器端的资源开始计时,访问一个网页,然后就不点击了,就开始计时,如果29分钟不动,之后再访问网站的其它资源,又开始重新计时,从0开始
默认30分钟可以在工程的web.xml中进行配置<session-config><session-timeout>30</session-timeout></session-config>
注意浏览器关闭是cookie默认销毁,但是session还会存在,但是cookie销毁session就没有什么意义了,因为找session要靠cookie
3)手动销毁session
session.invalidate();
我们要树立一个观念cookie和session都是和浏览器相关的,和用户是否登陆无关
session对象由服务器创建,开发人员可以调用request对象的getsession方法获取session对象,因为session默认有效期为一个会话(虽然它30分钟消亡,但是它的有效期还是一个会话,原因是cookie默认有效期一个会话,cookie死亡,session也没意义了)
那么如何才能让session所对应的那个cookie存活时间长点呢?不至于关掉浏览器就灭亡,它存活时间长,session才能更有意义。
首先我们要获取或创建session,然后获取这个session的JSESSIONID,然后创建cookie(要完全按照session所对应的cookie的键,这样才会覆盖),还要设置相同路径,session的cookie的默认路径为/应用名称,之后设置好时间,这样就ok了
session是为会话服务,也就是说所有浏览器访问的web应用都有机会可以获取到session,但是因为想要获取session前提是cookie,而cookie默认在哪个应用创建cookie,访问这个网站时浏览器才会带上这些cookie,所以自己的应用只能得到自己的cookie,访问自己的session。
如果浏览器把cookie给禁止了怎么办?
使用cookie的目的时让其带着sessionid去访问服务器资源,来确定是否有session可以用,若cookie被禁止的话,就只能在超链接后面加上session号了,这样访问超链接时,也相当于带着session号去访问资源,一次来确定是否有session可以用
这样购买链接后面带有session号,点击链接访问servlet1,它内部获取session的话,它自动会按照session号来找,和cookie一样,只不过以前cookie的是自动,而这个是手动设置,当两种方式都存在时,以cookie为主
同时打开多个浏览器在,只得是一个浏览器打开多个页面,比如新加选项卡,这些都是属于一个会话的
-
努比亚z9max手机音乐效验
该机拥有HIFI级音乐芯片,音乐效果不凡。具体体现在:1.音量调节,正常听音乐中高低音都是一个音量,而杜比音效能动态扩大某个音量。比如放打鼓声,杜比会及时提高低音加强鼓声。2.加强音域,杜比音效有开阔、集中、…
-
是atChristmas还是inChristmas
此处该用“on”。在圣诞节正确表达应为 “on Christmas ”。有具体日期的,比如知道几月几日的都用“on” ;不知道日期,但知道年份和月份的用“in” ,知道具体时间,比如几点几分用“at”。…
-
个体工商户应交纳什么税
纳税标准根据国家税务总局《个体工商户定期定额征收管理办法》文件精神 ,定期定额征收方式适用的税种及税率如下:1、根据《中华人民共和国增值税暂行条例》规定,自2009年1月1日起,小规模纳税人增值税征收率为3%…
-
材料成本差异率为负数是什么意思
材料成本差异额,是指材料的实际成本和计划成本之间的差额。差异率负数表示节约差异,即实际成本比计划成本小。正数表示超支差异,即实际成本比计划成本大。…
-
塞翁失马焉知非福是什么意思
比喻一时虽然受到损失,反而因此能得到好处。也指坏事在一定条件下可变为好事,反之亦然。形容人的心态,一定要乐观向上,任何事情都有二面性,不好的一面,有可能向好的一面转化。塞翁失马,焉知非福出自《 淮南子…