热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

cookie机制与session机制的区别

不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新

一、COOKIE机制和session机制的区别
*************************************************************************************
具体来说COOKIE机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session
机制可能需要借助于COOKIE机制来达到保存标识的目的,但实际上还有其他选择。
*************************************************************************************

二、会话COOKIE和持久COOKIE的区别
*************************************************************************************
如果不设置过期时间,则表示这个COOKIE生命周期为浏览器会话期间,只要关闭浏览器窗口,COOKIE就消失了。这种生命期为浏览会话期的COOKIE被称为会话COOKIE。会话COOKIE一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把COOKIE保存到硬盘上,关闭后再次打开浏览器,这些COOKIE依然有效直到超过设定的过期时间。
存储在硬盘上的COOKIE可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的COOKIE,不同的浏览器有不同的处理方式。
*************************************************************************************

三、如何利用实现自动登录
*************************************************************************************
当用户在某个网站注册后,就会收到一个惟一用户ID的COOKIE。客户后来重新连接时,这个
用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。
*************************************************************************************

四、如何根据用户的爱好定制站点
*************************************************************************************
网站可以使用COOKIE记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在COOKIE中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。
*************************************************************************************

五、COOKIE的发送
*************************************************************************************
1.创建COOKIE对象
2.设置最大时效
3.将COOKIE放入到HTTP响应报头
如果你创建了一个COOKIE,并将他发送到浏览器,默认情况下它是一个会话级别的COOKIE:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该COOKIE存储在磁盘上,则
需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该COOKIE。
发送COOKIE需要使用HttpServletResponse的addCOOKIE方法,将COOKIE插入到一个Set-COOKIE HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-COOKIE报头,而是创建新的报头,因此我们将这个方法称为是addCOOKIE,而非setCOOKIE。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。

六、COOKIE的读取
*************************************************************************************
1.调用request.getCOOKIE
要获取有浏览器发送来的COOKIE,需要调用HttpServletRequest的getCOOKIEs方法,这个调用返回COOKIE对象的数组,对应由HTTP请求中COOKIE报头输入的值。
2.对数组进行循环,调用每个COOKIE的getName方法,直到找到感兴趣的COOKIE为止
COOKIE与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个COOKIE,你也可能会得到许多不相关的COOKIE。
例如:
String COOKIEName = “userID”;
COOKIE COOKIEs[] = request.getCOOKIEs();
if (COOKIEs!=null){
for(int i=0;i COOKIE COOKIE = COOKIEs[i];
if (COOKIEName.equals(COOKIE.getName())){
doSomethingWith(COOKIE.getValue());
}
}
}
*************************************************************************************

七、如何使用COOKIE检测初访者
*************************************************************************************
A.调用HttpServletRequest.getCOOKIEs()获取COOKIE数组
B.在循环中检索指定名字的COOKIE是否存在以及对应的值是否正确
C.如果是则退出循环并设置区别标识
D.根据区别标识判断用户是否为初访者从而进行不同的操作
*************************************************************************************

八、使用COOKIE检测初访者的常见错误
*************************************************************************************
不能仅仅因为COOKIE数组中不存在在特定的数据项就认为用户是个初访者。如果COOKIE数组为null,客户可能是一个初访者,也可能是由于用户将COOKIE删除或禁用造成的结果。
但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置COOKIE,依据路径的设置,其中的任何COOKIE都有可能返回给用户的浏览器。
正确的做法是判断COOKIE数组是否为空且是否存在指定的COOKIE对象且值正确。
*************************************************************************************

九、使用COOKIE属性的注意问题
*************************************************************************************
属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。
因此除了名称和值之外,COOKIE属性只适用于从服务器输出到客户端的COOKIE;服务器端来自于浏览器的COOKIE并没有设置这些属性。
因而不要期望通过request.getCOOKIEs得到的COOKIE中可以使用这个属性。这意味着,你不能仅仅通过设置COOKIE的最大时效,发出它,在随后的输入数组中查找适当的COOKIE,读取它的值,修改它并将它存回COOKIE,从而实现不断改变的COOKIE值。
*************************************************************************************

十、如何使用COOKIE记录各个用户的访问计数
*************************************************************************************
1.获取COOKIE数组中专门用于统计用户访问次数的COOKIE的值
2.将值转换成int型
3.将值加1并用原来的名称重新创建一个COOKIE对象
4.重新设置最大时效
5.将新的COOKIE输出
*************************************************************************************

十一、session在不同环境下的不同含义
*************************************************************************************
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
*************************************************************************************

十二、session的机制
*************************************************************************************
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
*************************************************************************************

十三、保存session id的几种方式
*************************************************************************************
A.保存session id的方式可以采用COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于COOKIE可以被人为的禁止,必须有其它的机制以便在COOKIE被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
*************************************************************************************

十四、session什么时候被创建
*************************************************************************************
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
*************************************************************************************

十五、session何时被删除
*************************************************************************************
session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session COOKIE失效,不会使服务器端的session对象失效。
*************************************************************************************

十六、URL重写有什么缺点
*************************************************************************************
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。
*************************************************************************************

十七、使用隐藏的表单域有什么缺点
*************************************************************************************
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程
*************************************************************************************

十八、会话跟踪的基本步骤
*************************************************************************************
1.访问与当前请求相关的会话对象
2.查找与会话相关的信息
3.存储会话信息
4.废弃会话数据
*************************************************************************************

十九、getSession()/getSession(true)、getSession(false)的区别
*************************************************************************************
getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象
getSession(false):当session存在时返回该session,否则不会新建session,返回null
*************************************************************************************

二十、如何将信息于会话关联起来
*************************************************************************************
setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound
方法。
*************************************************************************************

二十一、会话属性的类型有什么限制吗
*************************************************************************************
通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象
*************************************************************************************

二十二、如何废弃会话数据
*************************************************************************************
A.只移除自己编写的servlet创建的数据:
调用removeAttribute(“key”)将指定键关联的值废弃
B.删除整个会话(在当前Web应用中):
调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们
servlet或JSP页面创建的会话数据
C.将用户从系统中注销并删除所有属于他(或她)的会话
调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用
*************************************************************************************

二十三、使用isNew来判断用户是否为新旧用户的错误做法
*************************************************************************************
public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。
但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。
因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。
正确的做法是判断某个session中是否存在某个特定的key且其value是否正确
*************************************************************************************

二十四、COOKIE的过期和Session的超时有什么区别
*************************************************************************************
会话的超时由服务器来维护,它不同于COOKIE的失效日期。首先,会话一般基于驻留内存的COOKIE
不是持续性的COOKIE,因而也就没有截至日期。即使截取到JSESSIONID COOKIE,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。
*************************************************************************************

二十五、session COOKIE和session对象的生命周期是一样的吗
*************************************************************************************
当用户关闭了浏览器虽然session COOKIE已经消失,但session对象仍然保存在服务器端
*************************************************************************************

二十六、是否只要关闭浏览器,session就消失了
*************************************************************************************
程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
之所以会有这种错误的认识,是因为大部分session机制都使用会话COOKIE来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。
如果服务器设置的COOKIE被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
由此我们可以得出如下结论:
关闭浏览器,只会是浏览器端内存里的session COOKIE消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化COOKIE消失。
*************************************************************************************

二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
*************************************************************************************
通常session COOKIE是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。
此时我们可以先把session id保存在persistent COOKIE中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session COOKIE和persistent COOKIE的结合我们就可以实现了跨窗口的会话跟踪。
*************************************************************************************

二十八、如何使用会话显示每个客户的访问次数
*************************************************************************************
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
value = new SomeImmutableClass(…); // 新创建一个不可更改对象
}else{
value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
}
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
*************************************************************************************

二十九、如何使用会话累计用户的数据
*************************************************************************************
使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如

HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
value = new SomeMutableClass(…);
session.setAttribute(“someIdentifier”,value);
}else{
value.updateInternalAttribute(…);     // 如果已经存在该对象则更新其属性而不需重新设置属性
}
*************************************************************************************

三十、不可更改对象和可更改对象在会话数据更新时的不同处理
*************************************************************************************
不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要
调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新
可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时
候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调
用setAttribute方法了
*************************************************************************************

一、COOKIE机制和session机制的区别
*************************************************************************************
具体来说COOKIE机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session
机制可能需要借助于COOKIE机制来达到保存标识的目的,但实际上还有其他选择。
*************************************************************************************

二、会话COOKIE和持久COOKIE的区别
*************************************************************************************
如果不设置过期时间,则表示这个COOKIE生命周期为浏览器会话期间,只要关闭浏览器窗口,COOKIE就消失了。这种生命期为浏览会话期的COOKIE被称为会话COOKIE。会话COOKIE一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把COOKIE保存到硬盘上,关闭后再次打开浏览器,这些COOKIE依然有效直到超过设定的过期时间。
存储在硬盘上的COOKIE可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的COOKIE,不同的浏览器有不同的处理方式。
*************************************************************************************

三、如何利用实现自动登录
*************************************************************************************
当用户在某个网站注册后,就会收到一个惟一用户ID的COOKIE。客户后来重新连接时,这个
用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。
*************************************************************************************

四、如何根据用户的爱好定制站点
*************************************************************************************
网站可以使用COOKIE记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在COOKIE中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。
*************************************************************************************

五、COOKIE的发送
*************************************************************************************
1.创建COOKIE对象
2.设置最大时效
3.将COOKIE放入到HTTP响应报头
如果你创建了一个COOKIE,并将他发送到浏览器,默认情况下它是一个会话级别的COOKIE:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该COOKIE存储在磁盘上,则
需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该COOKIE。
发送COOKIE需要使用HttpServletResponse的addCOOKIE方法,将COOKIE插入到一个Set-COOKIE HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-COOKIE报头,而是创建新的报头,因此我们将这个方法称为是addCOOKIE,而非setCOOKIE。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。

六、COOKIE的读取
*************************************************************************************
1.调用request.getCOOKIE
要获取有浏览器发送来的COOKIE,需要调用HttpServletRequest的getCOOKIEs方法,这个调用返回COOKIE对象的数组,对应由HTTP请求中COOKIE报头输入的值。
2.对数组进行循环,调用每个COOKIE的getName方法,直到找到感兴趣的COOKIE为止
COOKIE与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个COOKIE,你也可能会得到许多不相关的COOKIE。
例如:
String COOKIEName = “userID”;
COOKIE COOKIEs[] = request.getCOOKIEs();
if (COOKIEs!=null){
for(int i=0;i COOKIE COOKIE = COOKIEs[i];
if (COOKIEName.equals(COOKIE.getName())){
doSomethingWith(COOKIE.getValue());
}
}
}
*************************************************************************************

七、如何使用COOKIE检测初访者
*************************************************************************************
A.调用HttpServletRequest.getCOOKIEs()获取COOKIE数组
B.在循环中检索指定名字的COOKIE是否存在以及对应的值是否正确
C.如果是则退出循环并设置区别标识
D.根据区别标识判断用户是否为初访者从而进行不同的操作
*************************************************************************************

八、使用COOKIE检测初访者的常见错误
*************************************************************************************
不能仅仅因为COOKIE数组中不存在在特定的数据项就认为用户是个初访者。如果COOKIE数组为null,客户可能是一个初访者,也可能是由于用户将COOKIE删除或禁用造成的结果。
但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置COOKIE,依据路径的设置,其中的任何COOKIE都有可能返回给用户的浏览器。
正确的做法是判断COOKIE数组是否为空且是否存在指定的COOKIE对象且值正确。
*************************************************************************************

九、使用COOKIE属性的注意问题
*************************************************************************************
属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。
因此除了名称和值之外,COOKIE属性只适用于从服务器输出到客户端的COOKIE;服务器端来自于浏览器的COOKIE并没有设置这些属性。
因而不要期望通过request.getCOOKIEs得到的COOKIE中可以使用这个属性。这意味着,你不能仅仅通过设置COOKIE的最大时效,发出它,在随后的输入数组中查找适当的COOKIE,读取它的值,修改它并将它存回COOKIE,从而实现不断改变的COOKIE值。
*************************************************************************************

十、如何使用COOKIE记录各个用户的访问计数
*************************************************************************************
1.获取COOKIE数组中专门用于统计用户访问次数的COOKIE的值
2.将值转换成int型
3.将值加1并用原来的名称重新创建一个COOKIE对象
4.重新设置最大时效
5.将新的COOKIE输出
*************************************************************************************

十一、session在不同环境下的不同含义
*************************************************************************************
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
*************************************************************************************

十二、session的机制
*************************************************************************************
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
*************************************************************************************

十三、保存session id的几种方式
*************************************************************************************
A.保存session id的方式可以采用COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于COOKIE可以被人为的禁止,必须有其它的机制以便在COOKIE被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
*************************************************************************************

十四、session什么时候被创建
*************************************************************************************
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
*************************************************************************************

十五、session何时被删除
*************************************************************************************
session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止

再次注意关闭浏览器只会使存储在客户端浏览器内存中的session COOKIE失效,不会使服务器端的session对象失效。
*************************************************************************************

十六、URL重写有什么缺点
*************************************************************************************
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。
*************************************************************************************

十七、使用隐藏的表单域有什么缺点
*************************************************************************************
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的
超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程
*************************************************************************************

十八、会话跟踪的基本步骤
*************************************************************************************
1.访问与当前请求相关的会话对象
2.查找与会话相关的信息
3.存储会话信息
4.废弃会话数据
*************************************************************************************

十九、getSession()/getSession(true)、getSession(false)的区别
*************************************************************************************
getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象
getSession(false):当session存在时返回该session,否则不会新建session,返回null
*************************************************************************************

二十、如何将信息于会话关联起来
*************************************************************************************
setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound
方法。
*************************************************************************************

二十一、会话属性的类型有什么限制吗
*************************************************************************************
通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象
*************************************************************************************

二十二、如何废弃会话数据
*************************************************************************************
A.只移除自己编写的servlet创建的数据:
调用removeAttribute(“key”)将指定键关联的值废弃
B.删除整个会话(在当前Web应用中):
调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们
servlet或JSP页面创建的会话数据
C.将用户从系统中注销并删除所有属于他(或她)的会话
调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用
*************************************************************************************

二十三、使用isNew来判断用户是否为新旧用户的错误做法
*************************************************************************************
public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。
但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。
因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。
正确的做法是判断某个session中是否存在某个特定的key且其value是否正确
*************************************************************************************

二十四、COOKIE的过期和Session的超时有什么区别
*************************************************************************************
会话的超时由服务器来维护,它不同于COOKIE的失效日期。首先,会话一般基于驻留内存的COOKIE
不是持续性的COOKIE,因而也就没有截至日期。即使截取到JSESSIONID COOKIE,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。
*************************************************************************************

二十五、session COOKIE和session对象的生命周期是一样的吗
*************************************************************************************
当用户关闭了浏览器虽然session COOKIE已经消失,但session对象仍然保存在服务器端
*************************************************************************************

二十六、是否只要关闭浏览器,session就消失了
*************************************************************************************
程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
之所以会有这种错误的认识,是因为大部分session机制都使用会话COOKIE来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。
如果服务器设置的COOKIE被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
由此我们可以得出如下结论:
关闭浏览器,只会是浏览器端内存里的session COOKIE消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化COOKIE消失。
*************************************************************************************

二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
*************************************************************************************
通常session COOKIE是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。
此时我们可以先把session id保存在persistent COOKIE中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session COOKIE和persistent COOKIE的结合我们就可以实现了跨窗口的会话跟踪。
*************************************************************************************

二十八、如何使用会话显示每个客户的访问次数
*************************************************************************************
由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
value = new SomeImmutableClass(…); // 新创建一个不可更改对象
}else{
value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
}
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
*************************************************************************************

二十九、如何使用会话累计用户的数据
*************************************************************************************
使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如

HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
value = new SomeMutableClass(…);
session.setAttribute(“someIdentifier”,value);
}else{
value.updateInternalAttribute(…);     // 如果已经存在该对象则更新其属性而不需重新设置属性
}
*************************************************************************************

三十、不可更改对象和可更改对象在会话数据更新时的不同处理
*************************************************************************************
不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要
调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新
可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时
候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调
用setAttribute方法了
*************************************************************************************


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Microsoft Office for Mac最新版本安装教程,亲测可用!
    本文介绍了Microsoft Office for Mac最新版本的安装教程,经过亲测可用。Office工具是办公必备的工具,它为用户和企业设计,可以利用功能强大的Outlook处理电子邮件、日历和通讯录事宜。安装包包括Word、Excel、PPT、OneNote和Outlook。阅读本文可以了解如何下载并安装Office,以及安装过程中的注意事项。安装完毕后,可以正常使用Office中的Word等功能。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
author-avatar
书友51676198
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有