理解Cookie和Session(会话技术)
其实Cookie和Session就是会话技术的两种,他们各自有各自的作用。
会话技术的介绍
为什么需要会话技术?
由于http协议是无状态的,也就是说每个用户访问服务器的时候,服务器并不知道是谁在访问它。
所以这个时候我们就需要利用会话技术来帮助服务器来记住客户端。
举个例子:
我们的web购物系统,我们用户将将准备买的物品信息存储在哪里呢?
会话技术到底是什么?
一次会话:从打开一个浏览器访问一个服务器站点,到关闭这个浏览器的整个过程称。
会话技术分为两种,Cookie和Session:
+ Cookie: 将数据存储在本地磁盘,可以减少服务器的存储压力,但是安全性能不好,客户端用户可以自发的清楚掉Cookie信息。
+ Session:将数据存储在服务器中,安全性能好,但是服务器压力会比较大。
Cookie介绍
我用一个简单的例子来介绍Cookie是什么:
在我们日常生活中,比如我们是一个健身房的会员,健身房就会给你发一张VIP卡,这张VIP卡上面记录有你的姓名,联系方式,会员有效时间等等记录,每次你到健身房去健身,只要你拿出了这张健身卡别人就知道是你了。
这个例子就类似于我们用户第一次访问服务器,服务器也会像健身房一样给我们用户发送一些信息,用来记录用户信息。
一些Cookie的API
- 创建一个cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
/* 注意:cookie不能存储中文信息*/
- 设置Cookie的持久化时间:
cookie.setMaxAge(int seconds); /* 时间秒 */
注意:如果不设置持久化时间cookie会存储在浏览器的内存中,浏览器关闭的话Cookie的信息就销毁了,如果设置了持久化时间的话那么cookie将会被存储到磁盘文件中。
示例:
cookie.setMaxAge(10*60);
*设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器 自动删除该cookie信息*
- 删除客户端的cookie:
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时 间为0的cookie进行覆盖即可
cookie.setMaxAge(0);
- 向客户端发送cookie:
response.addCookie(Cookie cookie);
服务器接受客户端的信息
//获得客户端携带的Cookie的数据
/*获得信息并且输出*/
Cookie[] cookie = request.getCookies();
//通过cookie名称获得想要的cookie
for (Cookie cookie1 : cookie) {
String cookieName = cookie1.getName();
if (cookieName.equals("name")) {
String cookieValue = cookie1.getValue();
System.out.println(cookieValue);
}
}
Session介绍
Session是将数据存储到服务器端的技术,服务器会为每个用户开辟一个内存空间,但客户端每次访问都需要携带一个自己的ID去服务器寻找自己的内存空间。也就是说:session技术是基于cookie上的,session需要借助cookie存储客户的唯一标识:JESSIONID
- 获得Session对象:
/**
* 创建属于该客户端(回话)的私有的session区域
* request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
* 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
* 如果该客户端在此服务器已经存在session 则 获得已经存在的session并返回
* 一个浏览器属于一个客户端
*/
HttpSession session = request.getSession();
- 获得Session的独立id
String id = session.getId();
response.getWriter().write("JSESSIONID: "+id );
- Session的生命周期:
Session的创建:第一次调用:
request.getSession()
Session的销毁
1.服务器非正常关闭。
2.session 30分钟自动默认销毁( 从不操作服务器 开始计时30分钟销毁)
可以在工程的web.xml中进行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.手动销毁:
session.invalidate();
- 操作session的域对象:
和其他域对象的操作方式一样:
session.removeAttribute( String name);
session.getAttribute(String name);
session.setAttribute(String name,Object obj);
Cookie和Session的小应用:
Cookie-记录用户上一次访问的时间
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Date date = new Date();
//设置时间格式
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss"
);
String currentTime = format.format(date);
/**
* 1. 创建Cookie 记录当前最新的访问时间
*/
Cookie cookie = new Cookie("lastAccessTime", currentTime);
cookie.setMaxAge(60 * 10 * 1000);//时间尽量设置长些,两次访问相隔时间可能会比较长
response.addCookie(cookie);
/**
* 2.获得客户端携带的cookie记录 -lastAccessTime
*/
String lasAccessTime = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie coo : cookies) {
if ("lastAccessTime".equals(coo.getName())) {
lasAccessTime = coo.getValue();
}
}
}
response.setContentType("text/html;charset=UTF-8");
if (lasAccessTime != null) {
response.getWriter().write("您上次访问的时间是:"+lasAccessTime);
}else {
response.getWriter().write("您是第一次访问");
}
}
Session-验证码功能,在之前的博客中已经实现过了,这里给上我的源代码链接:
代码链接