2019/9/5 周四
学习内容:cookie,session,application
通过昨天的学习了解到,JavaWeb中的request和response对象可以用来页面跳转和传递数据,但不具备保存数据的功能。因此JavaWeb提供了cookie,session,application三个对象来存储数据。
cookie以文件的形式,将数据临时存储在用户的计算机上,只能记录key-value对。
cookie属于浏览器缓存,cookie文件一般存储在浏览器的temp文件夹中。因此cookie没有隐私权限的管理,对任何一个网站都是透明的,其他的网站都能拿到所有网站存在用户浏览器的cookie,所以各网站的cookie通都是经过了一定的加密方法进行过加密。并且一般不用cookie存用户密码。
cookie主要用来辨别用户身份、进行 session 跟踪。说通俗点,cookie可以让浏览器记住用户的特定信息,如上次访问的位置、花费的时间或用户首选项等等。
比如最常见的存储用户名,可以使用户在下一次进入时免登录,或者像在登录邮箱时,邮箱栏会自动填上用户的邮箱。
(1)存储数据
public void addCookie(Cookie cookie)
在用户登录后,可以实例化一个Cookie对象,并使用response对象的addCookie方法,把数据保存到浏览器的cookie文件。
Cookie cookie = new Cookie("cu_name",cu_name);
response.addCookie(cookie);
其中,new Cookie对象需要的两个参数就是一个key-value键值对,都是String类型。
(2)获取数据
public Cookie[] getCookies()
使用request对象的getCookies方法,可以获取浏览器中所有的cookie,返回一个Cookie的数组,如果一个cookie都没有就返回null。
从这一点也可以看出cookie是任何一个网站都可以拿到的,只是一般的网站会对其进行加密。
在知道key的情况下,通过遍历获得的Cookie数组,就可以获得需要的用户数据了
String cu_name=""; // 先定义一个空字符串,避免使用cu_name时,还没有获取到cookie,出现空指针异常
// 获取所有cookie
Cookie[] cookies = request.getCookies();
// 判断获取到的Cookie数组不为空且有内容
if(cookies!=null && cookies.length>0){
// 遍历数组
for(Cookie c: cookies){
// 通过c.getName获得key,判断是否有要找的key
if("cu_name".equals(c.getName())){
// 获取value并保存
cu_name=c.getValue();
}
}
}
(3)设置有效期
public void setMaxAge(int expiry)
cookie对象的setMaxAge方法,参数expiry表示cookie保存的最大时间,单位是秒,到时间后浏览器自动清除过期的cookie
这个方法可以用来实现登出功能,其实要做的就是清除用户的登录数据,设置参数为0,浏览器知道后就会马上清除
// 再实例化一个cookie对象,key是要清除的数据的key,value可以直接给一个空字符串,反正是要清除的
Cookie cookie = new Cookie("cu_name",cu_name);
// 设置0秒后过期
cookie.setMaxAge(0);
// 把这个cookie添加到浏览器缓存
response.addCookie(c);
(4) 有一点需要注意的是,保存cookie是浏览器的动作,如果页面要跳转,需要把保存cookie的动作放在跳转之前,否则虽然跳转后的代码是执行的,但是浏览器已经跳转了,就无法保存。
session和cookie一样也是用来保存临时数据,但不同的是它是保存在服务器端。
session又叫会话,会话可以在多次请求中保存和使用数据。
一个会话就是浏览器与服务器之间的一次通话,不关闭浏览器都算一次会话。如果关闭再重新打开浏览器或打开不同的浏览器,就算一次新的会话。
每个会话都有一个唯一的sessionid。当浏览器向服务器发送第一次请求的时候,就建立了一个新的会话,服务器就会为这次会话创建一个整个服务器都唯一的sessionid,这一次会话中的请求和响应都会携带上这个sessionid。
由于每次会话,服务器都会创建新的sessionid,浏览器既得不到其他浏览器会话的数据,也得不到上一次浏览器会话的数据,(因为拿不到sessionid)。
在关闭浏览器的时候,一次会话就结束了。但有时由于浏览器故障非正常关闭,该次会话还没有关闭,如果服务器保存的会话数据量越来越大,会导致性能问题或服务器崩溃,因此服务器会主动清除长时间没有再次发出请求的session(默认30分钟),及时释放会话资源。
session保存在服务器上,只有服务器重启的时候才会真正消失。
(1)session可以解决浏览器显示中文乱码的问题
由于我们写的程序可能用的是utf-8编码,但浏览器使用的编码可能是gbk,用cookie保存数据在客户端,虽然保存的是中文,但如果要显示在浏览器上就会乱码。但session是保存在服务器上的,只要数据在服务器端,就不会有中文乱码的问题。
(2)可以存储任何类型的数据
由于不能控制客户端的内存,cookie是保存在客户端的文本文件中,所以只能保存String类型。但session是保存在服务端,可以使用服务端的内存,所以可以保存任意类型的数据,可以保存对象。
(1)存储数据
Public void setAttribute(String name, Object value);
session的存储和获取数据在使用上与cookie类似,只是session的value可以是任意类型的对象。
session.setAttribute("cu_name", cu_name);
(2)获取数据
Public Object getAttribute(String name);
String cu_name = session.getAttribute("cu_name");
application的作用和用法与session基本一致,区别就在于,session中存储的数据在一个会话的有效期内可用,而application中存储的数据在整个Web项目中可用。
因此application比较占内存,企业中一般不会使用。
(与session基本一致)
(1)存储数据
public void setAttribute(String name, Object object
(2)获取数据
public Object getAttribute(String name)
application常用来实现计数,即统计页面被访问的次数
下面是一个统计页面被访问的次数的例子,但事实上,访问次数都是可以由程序员随意设置的
Java代码:
int count = 1000000; // 初始访问量就设置为一百万
// 先判断网站是不是第一次被访问,如果是,count应该是null
if(application.getAttribute("count")==null){
// 设置count的初始值
application.setAttribute("count", 1000000);
}else{
// 获取目前的访问量count
count = (int)application.getAttribute("count");
// count增加
count +=new Random().nextInt(10000);
// 重新设置
application.setAttribute("count", count);
}
HTML代码,页面中显示访问量:
欢迎您!您是我们网站的第<%=count %>个访问者
对象 | 相同点 | 不同点 | 常见用途 |
---|---|---|---|
cookie | 存储数据 | 存储的数据仅在一个请求中可用 | 实现自动填写用户名 |
session | 存储数据 | 存储的数据在一个会话的有效期内可用 | 在多页面显示用户名 |
application | 存储数据 | 存储的数据在整个Web项目中可用 | 统计页面访问次数 |