一、Session:是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中的(HttpSession)。
二、HttpSession对象的方法主要就是域的三个方法:
object getAttribute(String name)
void setAtrribute(Strng name,object value)
removeAttribute(String name)
session的获取使用HttpSession request.getSeeion();进行获取就可以了。
三、问题:服务器如何确保在一次会话范围内,多次获取的Session对象是同一个对象?
Session是依赖于Cookie的,当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:(Cookie:JSESSIONID=客户端第一次拿到的session ID)。
在每次请求时,在请求头中Cookie都会带着这个Session。使用Request获取的Session都是同一个。
四、细节:
1.当客户端关闭后,服务器不关闭,默认情况下两次获取的不是同一个(session依赖于Cookie,Cookie都挂了,session还能是同一个吗?)。但是如果我们期望客户端关闭之后,session也不会发生改变的话。可以使用。
Cookie cookie = new Cookie(“JSESSIONID”,session.getId());
cookie.setMaxAge(int time);
response.addCookie(cookie);
手动设置cookie持久化存活,并将服务器创建的session进行覆盖,就可以长时间使用session保存信息了。
关闭浏览器后再次访问,发现session并没有改变。
但是在关闭服务器之后,重启之后还是发生了改变。
2.服务器关闭之后获取的session获取不到同一个,即使获取到同一个地址值,也不是同一个session,只不过是因为随机生成的地址相同罢了。
但是即使不是同一个,也要想办法确保存储的数据不丢失。
session的钝化:
*在服务器正常关闭之前,将session对象系列化到硬盘上。
*在服务器重启之后,将session文件转化为内存中的session对象即可。
tomact已经自动完成了这一步。 (不用你管)
3.session什么时候被销毁?
1.服务器关闭
2.session对象调用invalidate()。
3.session的默认失效时间是30分钟。
但是我们可以手动配置
在tomcat的conf目录下有一个web.xml,在其中有个一个子元素
可以看到其默认为30,可以对其进行修改。但是这样修改之后,所有发布在本地服务器上的web项目中的session的存活时间都会发生改变。
如果只是想单独改变一个web项目的,可以在web项目的web.xml进行配置
<session-config>
<session-timeout>配置时间(分钟)</session-timeout>
</session-config>
五、session的特点:1.用于存储一次会话多次请求见的数据,存储在服务器端。
2.session可以存储任意类型任意大小的数据。
session与Cookie的区别:session存储数据在服务器端。Cookie存储在客户端。
session没有数据大小限制,Cookie有。
session数据安全,Cookie因为存储在客户端,数据相对不太安全。