JavaWeb笔记 day02(cookie,session,application存储数据)

JavaWeb笔记 day02

2019/9/5 周四
学习内容:cookie,session,application


通过昨天的学习了解到,JavaWeb中的request和response对象可以用来页面跳转和传递数据,但不具备保存数据的功能。因此JavaWeb提供了cookie,session,application三个对象来存储数据。

一、cookie

1.cookie是什么

cookie以文件的形式,将数据临时存储在用户的计算机上,只能记录key-value对。

cookie属于浏览器缓存,cookie文件一般存储在浏览器的temp文件夹中。因此cookie没有隐私权限的管理,对任何一个网站都是透明的,其他的网站都能拿到所有网站存在用户浏览器的cookie,所以各网站的cookie通都是经过了一定的加密方法进行过加密。并且一般不用cookie存用户密码。

2.cookie的作用

cookie主要用来辨别用户身份、进行 session 跟踪。说通俗点,cookie可以让浏览器记住用户的特定信息,如上次访问的位置、花费的时间或用户首选项等等。

比如最常见的存储用户名,可以使用户在下一次进入时免登录,或者像在登录邮箱时,邮箱栏会自动填上用户的邮箱。

3.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

1.session是什么

session和cookie一样也是用来保存临时数据,但不同的是它是保存在服务器端

session又叫会话,会话可以在多次请求中保存和使用数据。

一个会话就是浏览器与服务器之间的一次通话,不关闭浏览器都算一次会话。如果关闭再重新打开浏览器或打开不同的浏览器,就算一次新的会话。

每个会话都有一个唯一的sessionid。当浏览器向服务器发送第一次请求的时候,就建立了一个新的会话,服务器就会为这次会话创建一个整个服务器都唯一的sessionid,这一次会话中的请求和响应都会携带上这个sessionid。

由于每次会话,服务器都会创建新的sessionid,浏览器既得不到其他浏览器会话的数据,也得不到上一次浏览器会话的数据,(因为拿不到sessionid)。

在关闭浏览器的时候,一次会话就结束了。但有时由于浏览器故障非正常关闭,该次会话还没有关闭,如果服务器保存的会话数据量越来越大,会导致性能问题或服务器崩溃,因此服务器会主动清除长时间没有再次发出请求的session(默认30分钟),及时释放会话资源。

session保存在服务器上,只有服务器重启的时候才会真正消失。

2.session的作用

(1)session可以解决浏览器显示中文乱码的问题

由于我们写的程序可能用的是utf-8编码,但浏览器使用的编码可能是gbk,用cookie保存数据在客户端,虽然保存的是中文,但如果要显示在浏览器上就会乱码。但session是保存在服务器上的,只要数据在服务器端,就不会有中文乱码的问题。

(2)可以存储任何类型的数据

由于不能控制客户端的内存,cookie是保存在客户端的文本文件中,所以只能保存String类型。但session是保存在服务端,可以使用服务端的内存,所以可以保存任意类型的数据,可以保存对象。

3.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

1.application是什么

application的作用和用法与session基本一致,区别就在于,session中存储的数据在一个会话的有效期内可用,而application中存储的数据在整个Web项目中可用

因此application比较占内存,企业中一般不会使用。

2.application的用法

(与session基本一致)

(1)存储数据
public void setAttribute(String name, Object object

(2)获取数据
public Object getAttribute(String name)

3.application的用途

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三个对象对比

对象 相同点 不同点 常见用途
cookie 存储数据 存储的数据仅在一个请求中可用 实现自动填写用户名
session 存储数据 存储的数据在一个会话的有效期内可用 在多页面显示用户名
application 存储数据 存储的数据在整个Web项目中可用 统计页面访问次数

你可能感兴趣的:(JavaWeb)