Servlet:Cookie会话技术
会话技术
1.cookie
2.session
会话(session)
1.什么是会话?
会话可以简单理解为:用户开一个访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话
比如打电话,我打通对方电话,只要电话不挂,这次会话就没有结束。
2.会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据。
例如,多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结账servlet时,结账servlet可以得到用户各自购买的商品为用户结账。
提问:这些数据保存在request行不行?
答案:肯定不行!
保存会话的技术-cookie
抛砖引玉:思考一个问题:
1.有时候,在访问一个网站的时候,能看到提示你上次登录网站的时间,而且要注意的是不同用户上次登录的时间肯定是不一样的,这是怎么实现的?
一种方法,可以采用保存用户的登录时间
那么学会cookie之后,就可以使用cookie来实现
2.大家在访问某个购物网站的时候,能够看到提示你曾经浏览过的商品,同样也是不同的用户浏览过的商品肯定不一样,这是怎么实现的?
这种功能,往往不需要登录就能够提示,显然不是保存在服务器端的,也就是不能够通过数据库来实现。所以肯定要用cookie来实现
3.如何把登录的用户名和密码保存在电脑,下次登录的时候不需要重新输入?
所有这些功能的解决之道:cookie技术
1.什么是cookie
cookie(小甜饼)是客户端技术,服务器把每个用户的数据以cookie的形式写给用户的各自浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
服务器在客户端保存用户的信息,比如登录名,密码等…就是cookie
这些信息就像是小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取。
cookie原理示意图如下:
编写servlet代码createcookie.java,保存cookie信息:username=gavin,我们可以看到抓包情况:
编写servlet代码readcookie.java,读取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值
可以使用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);
可以看到运行结果:
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);