Cookie与Session的理解

理解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的小应用:

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-验证码功能,在之前的博客中已经实现过了,这里给上我的源代码链接:
代码链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值