Cookie和Session总结

Cookie

cookie介绍

Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是通过访问主机中的一个文件来实现的,这个文件就是 Cookie。在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。

cookie的简单使用

新建一个servlet,创建一个cookie,通过response.addCookie发送到客户端,如果要发送多个cookie可以重复下面两行代码。

Cookie cookie = new Cookie("name","tom");
response.addCookie(cookie);

在另一个servlet中获取浏览器中的cookie。

Cookie[] cs = request.getCookies();
for (Cookie c : cs) {
      System.out.println(c.getName()+" "+c.getValue());
}

cookie常用API

name:名称不能唯一确定一个Cookie。路径可能不同。
value:不能存中文和空格。
path:默认值是写Cookie的那个程序的访问路径
maxAge:cookie的缓存时间。默认是负数(默认存在浏览器的内存中),即浏览器关闭则销毁cookie,单位是秒;设置为0表示删除该cookie ;正数表示缓存(持久化到磁盘上)的时间。
设置cookie存活时间为30天:

cookie.setMaxAge(60*60*24*30);

使用cookie发送中文和空格

cookie是不支持中文的,想要发送中文要使用URL编码。

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
//使用URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
Cookie cookie = new Cookie("lastTime",str_date);
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);

获取浏览器中的cookie,使用URL解码读取。

response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
	if ("lastName".equals(c.getName())) {  //这里把"lastTime"放前面是为了防止空指针异常
		String value = c.getValue();
		//解码
		value = URLDecoder.decode(value,"utf-8");
		response.getWriter.write("<h2>欢迎回来,您上次登录时间为"+value+"</h2>");
	}
}

cookie共享范围

cookie默认只能共享在当前项目。
如果要共享到整个服务器,要设置Path。

cookie.setPath("/");

如果要让不同的服务器共享cookie,要使用setDomain(String path),设置一级域名相同,多个服务器之间就能共享cookie。

cookie.setDomain(".baidu.com");  //tieba.baidu.com和news.baidu.com中cookie就可以共享

Session

session介绍

在web开发过程中,服务器给每个用户浏览器会创建一个会话对象(session对象)。一个浏览器独享一个session对象,因此在保存用户数据时,服务器程序可以把用户数据写到用户浏览器独享的session中。当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,直接使用。

session和cookie的区别

Cookie是把用户的数据写给用户浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,程序员可以调用request对象中的 getSession()方法得到session对象。
Cookie安全性不高,因为cookie信息是存储在客户端,其他人很容易存放到cookie中去,容易造成cookie欺骗;而session信息是存储在服务器上,因此比较安全。
单个Cookie保存的数据时不超过4k,每个浏览器限制每个站点最多存储20个Cookie;而Session不存在这种问题。

session简单原理

session的实现是依赖于cookie的。服务器创建Session之后,会把session的ID,以cookie的形式回写给用户机,name属性为JSESSIONID, 只要用户机的浏览器没有关闭,再次去访问服务器时,都会带着session的ID号去,服务器就会发现浏览器带着session的ID号,就会使用内存中与之对应的session位置服务。

使用session共享数据

获取session

HttpSession session = request.getSession();
session.setAttribute("hello","hello session");

控制台输出session

HttpSession session = request.getSession();
Object hello = session.getAttribute("hello");
System.out.println(hello);

延长session存活时间

我们期望客户端关闭后,也能使用相同的session。

HttpSession session = request.getSession();
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60*24);
response.addCookie(c);

当服务器重新启动后,两次获取的session不是同一个,但我们希望数据不丢失。
session的钝化和活化:如果把项目部署到tomcat服务器上(把项目的war包放到tomcat的webapps文件夹里),tomcat会自动实现这个过程,而IDEA不能实现。

session的钝化:
	服务器正常关闭之前,将session对象序列化到硬盘上。
session的活化:
	服务器启动后,将session文件转化为内存中的session对象。

session的销毁

1)服务器关闭,session销毁
2)调用session的invalidate()方法销毁session
3)session默认失效时间:30分钟
我们可以在web.xml中设置session的默认失效时间

<session-config>
	<session-timeout>120</session-timeout>
</session-config>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值