Cookie和Session

1、会话

在日常生活中,我们和别人的一次交流就是回话。web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。比如我们在网上购物,登陆后,会话开始,关闭浏览器后,这个会话就结束了。当我们再次打开浏览器,想要购物的时候,还得重新登陆。(但是,有的时候我们长时间静止在网站上,再次看时需要重新登陆,这是也了安全)

注意:并不是打开一个网页就是一个会话,比如ie打开个标签并不是会话,而是右键菜单–文件–新建会话(不同浏览器不一样)。

2、为什么会有Cookie和Session

原因:http无状态的协议,什么是无状态呢,是指http没有记忆的功能。如果没有状态的情况下,需要每次链接都传送大量数据,比如说在购物的时候,如果没有cookie和session每浏览加入购物车一次都得重新登陆。
为了解决这一问题,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。

3、Cookie:客户端会话

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

cookies有什么作用呢?比如我们在某个网站注册了,当我们下次访问的时候,会向你问好。比较常见的是记住密码(一周内记住我)之类的。很方便我们再次访问。
Cookie和Session_第1张图片

以记住用户名和密码为例:
我们在myeclipse中新建web project项目
在AServler中发送给浏览器用户名和密码,在BServlet中得到用户名和年龄了:
Cookie和Session_第2张图片
代码如下:
在AServlet中

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 发送cookie让浏览器记住
        //创建Cookie对象,记住的内容是键值对形式;
        Cookie cookie = new Cookie("name", "yu");
        Cookie cookie2 = new Cookie("age", "20");
        //将cookie发送给浏览器;
        response.addCookie(cookie);
        response.addCookie(cookie2);
    }
}

在BServlet中

public class BServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 取出在AServlet要求在浏览器中记住的信息
        Cookie cookies[] = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                if (c.getName().equals("name")) {
                    System.out.println("从AServlet中获取的用户名" + c.getValue());
                } else if (c.getName().equals("age")) {
                    System.out.println("从AServlet中获取的用户名" + c.getValue());
                }
            }
        }
    }
}

然后首先访问AServlet,再访问BServlet,这样看打印日志:
Cookie和Session_第3张图片
这样我们就从BServlet中取出AServlet中的用户名和密码了。
首先访问AServlet的时候
分析,使用Fiddler抓包:
Cookie和Session_第4张图片
从上面可以看出这就是浏览器记住cookie的位置

然后再访问BServlet抓包:
Cookie和Session_第5张图片

当我们再次访问浏览器的时候,从请求中可以看出cookie从请求头在携带过去

  1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  5. 注意,删除cookie时,path必须一致,否则不会删除

3、Session:服务器端会话

session也是一种会话,cookie是把数据写在客户端,而session是把数据存储在服务器
Cookie和Session_第6张图片
session技术基于cookie没有cookie,session也无法完成。
既然session是存储在服务器的工作,那么我们客户端就少了很多工作
1、浏览器在第一次访问服务器时,服务器发现没有携带sessionId,会自动创建session对象。并将创建的cookie对象保存sessionId发送给浏览器。
2、在浏览器发送请求时,带有cookieid的session


Session实际应用场景

1、使用Session完成用户登陆;利用Session实现一次性验证码
2、利用Session防止表单重复提交

用session实现验证码

  1. 在原表单页面,生成一个验证码的图片,生成图片的同时需要把该图片中的字符串放入到session中。
  2. 在原表单页面,定义一个文本域用于输入验证码。
  3. 在目标的Servlet 中:获取session 和 表单域中的验证码的值
  4. 比较两个值是否一致:若一致,受理请求,且把session域中的验证码清除
  5. 若不一致,则直接通过重定向的方式返回原表单页面,并提示用户“验证码错误”

Cookie和Session_第7张图片

下面这篇是session在android中的使用(android中图片验证码)
http://blog.csdn.net/androidxiaogang/article/details/51943216

4、session过期

在我们登陆后,都会设置session的时效,确保用户在一段时间内没有登陆,重新登陆。一方面为用户安全,另一方面减少服务器压力。
session的时效设置是由服务器的时间来统计的
比如设置session.setMaxInactiveInterval(600),即在没有活动10分钟后,session将失效。 这时候提示用户重新登陆就可以了

你可能感兴趣的:(web)