Servlet——Cookie

会话技术

1.cookie
2.session

会话(session)

1.什么是会话?
会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话

比如打电话,我打通对方电话,只要电话不挂,这次会话就没有结束。

2.会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据。

例如,多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结账servlet时,结账servlet可以得到用户各自购买的商品为用户结账。

提问:这些数据保存在request行不行?
答案:肯定不行!

抛砖引玉:思考一个问题:
1.有时候,在访问一个网站的时候,能看到提示你上次登录网站的时间,而且要注意的是不同用户上次登录的时间肯定是不一样的,这是怎么实现的?

一种方法,可以采用数据库保存用户的登录时间
那么学会cookie之后,就可以使用cookie来实现

2.大家在访问某个购物网站的时候,能够看到提示你曾经浏览过的商品,同样也是不同的用户浏览过的商品肯定不一样,这是怎么实现的?

这种功能,往往不需要登录就能够提示,显然不是保存在服务器端的,也就是不能够通过数据库来实现。所以肯定要用cookie来实现

3.如何把登录的用户名和密码保存在电脑,下次登录的时候不需要重新输入?

所有这些功能的解决之道:cookie技术

1.什么是cookie

cookie(小甜饼)是客户端技术,服务器把每个用户的数据以cookie的形式写给用户的各自浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

服务器在客户端保存用户的信息,比如登录名,密码等…就是cookie
这些信息就像是小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取。

cookie原理示意图如下:
Servlet——Cookie_第1张图片
编写servlet代码CreateCookie.java,保存cookie信息:username=gavin,我们可以看到抓包情况:
Servlet——Cookie_第2张图片
编写servlet代码ReadCookie.java,读取cookie信息,此时的抓包情况:
Servlet——Cookie_第3张图片

2.cookie可以用来做什么?

  • 保存上次登录时间等信息
  • 保存用户名、密码,在一定时间不用重新登录
  • 记录用户访问网站的喜好(比如有无背景音乐、网页的背景色是什么)
  • 网站的个性化,比如定制网站的服务,内容。

3.cookie的使用

  1. cookie是在服务器端创建的

  2. cookie是保存在浏览器端的

  3. cookie的生命周期可以通过cookie.setMaxAge()方法来设置,单位是秒。

    特别强调:如果不设置setMaxAge,则该cookie在浏览器关闭时就不存在了

cookie的创建代码是这样的:

//创建cookie
Cookie cookie = new Cookie("username", "gavin");
// 设置cookie的生命周期为1个小时
cookie.setMaxAge(3600);
// 把cookie信息回写给浏览器
// Set-Cookie:username=gavin; Expires=Sun, 08-May-2016 11:35:55 GMT
response.addCookie(cookie);
读取代码是这样的:
// cookie会自动跟着request传递过来
// 读取所有cookie信息,之后再选出自己需要的cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
    String name = cookie.getName();
    String value = cookie.getValue();
    out.println("cookie的名字:"+name+"<br>");
    out.println("cookie的值:"+value+"<br>");
}
4.cookie可以被多个浏览器共享

但实际上,由于各个浏览器保存cookie的方式和路径不同,是无法做到不同的浏览器共享cookie的

5.怎么理解:我们可以把cookie想象成一张表
名字String 值String

有一个问题:如果cookie重名会出现什么情况?
答案:如果重名就会替换为新的cookie值

6.一个web应用可以保存多个cookie 7.cookie存放的时候是以明文方式存放的,因此它的安全性比较低。如果想要提高安全性,我们可以通过加密后再保存。

可以使用MD5算法:以后我们的密码都要使用加密存放,在验证密码的时候对用户输入的密码,进行md5加密,然后再到数据库去验证。

**例子:保存用户登录时间:** 改进用户管理系统,使用Cookie保存某个用户上次登录的时间,用于下次登录显示。 在用户主界面加上如下代码:
// 第一次登录提示语
String welcome = "您是第一次登录";
String lasttime = null;// 上次访问时间
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
    // Cookie保存的方式为:值=lasttime-用户ID,vlue=登录的时间
    // 例如,lasttime-123:2016-05-08 20:08:08
    if(("lasttime-"+user.getId()).equals(cookie.getName())){
        lasttime = cookie.getValue();
        break;
    }
}
if(lasttime != null){
    welcome = "上次登录时间:"+lasttime;
}

//更新cookie,记录当前登录的时间,并回写给客户端,用于下次登录提示
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Cookie cookie = new Cookie("lasttime-"+user.getId(), sdf.format(new Date()));
cookie.setMaxAge(3600*24*7);
response.addCookie(cookie);

可以看到运行结果:
Servlet——Cookie_第4张图片

4.总结cookie相关的函数

1.public Cookie(String name,String value)

2.setValue方法和getValue方法

3.setMaxAge方法和getMaxAge方法

4.getName方法

如何回写Cookie

addCookie方法是response接口提供的,会给http响应头中增加一个相应的Set-Cookie消息头

如何获取Cookie

getCookies方法,由request接口提供,获取客户端提交的Cookie

5.cookie的深入讨论

  1. 一个Cookie只能保存字符串信息

  2. 一个web应用可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个web应用提供的cookie
    但要注意的是,一个浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段

3.cookie默认生命周期是会话级别(即存储在浏览器的内存中),用户退出浏览器之后即被删除,当然你可以通过setMaxValue(int expiry)来设置Cookie的生命周期,如果设为0,则是指示浏览器删除该cookie,并要求重新addCookie才能生效。

4.注意,删除cookie时,path必须一致,否则不会删除。

5.补充,cookie怎么存放中文?
存放的时候:

String val = java.net.URLEncoder.encode("小明","utf-8");
Cookie cookie = new Cookie("name",val);

取出的时候:

String val = cookie.getValue();
val = java.net.URLDecoder.decode(val,"utf-8");
out.println("name:"+val);

你可能感兴趣的:(session,servlet,cookie)