欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Servlet:Cookie会话技术

程序员文章站 2022-03-24 23:45:34
会话技术 1.cookie 2.session 会话(session) 1.什么是会话? 会话可以简单理解为:用户开一个访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过...

会话技术

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会话技术
编写servlet代码createcookie.java,保存cookie信息:username=gavin,我们可以看到抓包情况:
Servlet:Cookie会话技术
编写servlet代码readcookie.java,读取cookie信息,此时的抓包情况:
Servlet:Cookie会话技术

2.cookie可以用来做什么?

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

3.cookie的使用

cookie是在服务器端创建的

cookie是保存在浏览器端的

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+"
");
    out.println("cookie的值:"+value+"
");
}
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.总结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的深入讨论

一个cookie只能保存字符串信息

一个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);