1.cookie
2.session
1.什么是会话?
会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话
比如打电话,我打通对方电话,只要电话不挂,这次会话就没有结束。
2.会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据。
例如,多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结账servlet时,结账servlet可以得到用户各自购买的商品为用户结账。
提问:这些数据保存在request行不行?
答案:肯定不行!
抛砖引玉:思考一个问题:
1.有时候,在访问一个网站的时候,能看到提示你上次登录网站的时间,而且要注意的是不同用户上次登录的时间肯定是不一样的,这是怎么实现的?
一种方法,可以采用数据库保存用户的登录时间
那么学会cookie之后,就可以使用cookie来实现
2.大家在访问某个购物网站的时候,能够看到提示你曾经浏览过的商品,同样也是不同的用户浏览过的商品肯定不一样,这是怎么实现的?
这种功能,往往不需要登录就能够提示,显然不是保存在服务器端的,也就是不能够通过数据库来实现。所以肯定要用cookie来实现
3.如何把登录的用户名和密码保存在电脑,下次登录的时候不需要重新输入?
所有这些功能的解决之道:cookie技术
cookie(小甜饼)是客户端技术,服务器把每个用户的数据以cookie的形式写给用户的各自浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
服务器在客户端保存用户的信息,比如登录名,密码等…就是cookie
这些信息就像是小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取。
cookie原理示意图如下:
编写servlet代码CreateCookie.java,保存cookie信息:username=gavin,我们可以看到抓包情况:
编写servlet代码ReadCookie.java,读取cookie信息,此时的抓包情况:
IE浏览器可以找到保存Cookie的临时文件夹,而Chrome的话可以直接从设置的高级选项中看到浏览器都保存了哪些站点的哪些Cookie信息。比如我的Chrome保存的所有Cookie如下:
可以看到,我们刚刚创建的一个Cookie已经被保存下来了。我们可以点开看看它保存的内容:
可以看到我们保存的Cookie的各种信息,内容正是我们的username=gavin。在程序中我们设置的Cookie的生命周期为1个小时,那么从图片中也可以看到它的创建时间和过期时间,中间正好就是1个小时。
相关的代码可以参考下文
- 保存上次登录时间等信息
- 保存用户名、密码,在一定时间不用重新登录
- 记录用户访问网站的喜好(比如有无背景音乐、网页的背景色是什么)
- 网站的个性化,比如定制网站的服务,内容。
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);
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
一个Cookie只能保存字符串信息
一个web应用可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个web应用提供的cookie
但要注意的是,一个浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段
cookie默认生命周期是会话级别(即存储在浏览器的内存中),用户退出浏览器之后即被删除,当然你可以通过setMaxValue(int expiry)
来设置Cookie的生命周期,这时候它才会被浏览器保存在磁盘文件。但如果设为0,则是指示浏览器删除该cookie,并要求重新addCookie才能生效。
注意,删除cookie时,path必须一致,否则不会删除。
补充,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);