Cookie和Session总结

Cookie概述


    Cookie是什么?  
   
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递.Cookie包含每次用户访问站点时Web应用程序都可以读取的信息.

为什么需要Cookie?
   
因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分是不是来源于同一个浏览器.所以,需要额外的数据用于维护会话.Cookie正是这样的一段随HTTP请求一起被传递的额外数据.
    Cookie能做什么?
   
Cookie只是一段文本,所以它只能保存字符串.而且浏览器对它有大小限制以及它会随着每次请求被发送到服务器,所以应该保证它不要太大.Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以,不适合保存重要的或者涉及隐私的内容

每个浏览器都有一个保存Cookie的文件,这个Cookie是保存在客户端的..我们访问一个网站的时候返回的不仅是html页面,同时返回的还有一个文件:cookie.所以,每当我们用浏览器访问一个页面时,会先从cookie里面遍历,看有没有,如果有就会带上.
       
       可以使用Cookie
的setXXX方法来设定一些相应的值

        setName(String name)/getName()

setValue(String value)/getValue()

setMaxAge(int age)/getMaxAge()

利用HttpServletResponse的addCookie(Cookie)方法将它设置到客户端

利用HttpServletRequest的getCookies()方法来读取客户端的所有Cookie,返回一个Cookie数组

设置Cookie
        SetCookies.java

读取Cookie
        ShowCookies.java

通过下面这段代码设置Cookie:

public class _06_ServletCookie extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        for (int i = 0; i < 6; i++) {
            Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value:" + i);
            resp.addCookie(cookie);

            //只有用 javax.servlet.http.Cookie.setMaxAge() 函数设置了生命周期的cookie才会写进客户端电脑的硬盘中
            //这种的只要不过期,cookie就会存在
            //如果没有设置生命周期的,只会保存在浏览器域的内存中,浏览器一关闭,就会被删除
            Cookie cookie2 = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P"+i);

            cookie2.setMaxAge(3000);
            //通过 javax.servlet.http.HttpServletResponse.addCookie();当时把cookie发送给客户端
            resp.addCookie(cookie2);
        }

        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        String title = "Setting Cookie";
        out.println(
                "<html><head><title></title></head>"
                + "<body>\n"
                + "<h1 align=‘center‘>" + title + "</h1>\n"
                + "To See them,visit the\n"
                + "<a href=‘_07_ShowCookies‘>\n"
                + "<CODE>ShowCookie</CODE>Servlet</a>"
                + "</body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }
}

通过下面这段代码来显示我们设置的Cookie信息

public class _07_ShowCookies extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        String title = "Active Cookie";
        out.println(
                "<html><head><title>接受客户端Cookie</title></head>"
                + "<body><h1>"+title+"</h1>"
                + "<table align=‘center‘ border=1>\n"
                + "<tr><th>Cookie Name</th><th>Cookie value</th></tr>"
                );
        Cookie[] cookies = req.getCookies();
        if(cookies != null){
            Cookie cookie;
            for (int i = 0; i < cookies.length; i++) {
                cookie = cookies[i];
                out.println(
                        "<tr>\n"
                        + "<td>" + cookie.getName() + "</td>"
                        + "<td>" + cookie.getValue() + "</td></tr>\n"
                        );
            }
            out.println("</table></body></html>");
        }else{
            out.println("<tr><td colspan=‘2‘>没有本网站的Cookie</td></tr>");
            out.println("</table></body></html>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

运行之前我们先看看浏览器保存的Cookie,由于我之前清空了Cookie,所以这里显示没有保存Cookie 
 

然后我们运行代码,先运行_06_ServletCookie,设置Cookie,
 
  再看看浏览器保存的Cookie
 

然后点击_06_ServletCookie中的超链接,我们设置的Cookie全部显示出来了


 
在_06_ServletCookie中一共设置了2种Cookie,一种有时间限制,一个没有设置时间.
 
这里关闭浏览器,然后直接进入_07_ShowCookies中
  "
 
通过结果我们可以看出,没有设置时间的Cookie没有了,而设置时间的Cookie依然存在.所以如果Cookie没有设置时间限制的话,浏览器一关闭,保存的Cookie会自动删除

如果不运行_06_ServletCookie直接运行_07_ShowCookies呢?
 
 
显示没有保存的Cookie,因为没有设置Cookie

Session
    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息.

当程序需要为某个客户端请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session表示,成为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用,如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端

如果浏览器支持Cookie,创建Session的时候会把SessionID保存在Cookie里
   
如果不支持Cookie,必须自己编程使用URL重写的方法实现Session

public class _08_SetSessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //设置MIME类型为text/html
        resp.setContentType("text/html;charset=utf-8");

        //获取当前的Session,如果没有可以创建
        //getSession(),如果为false,没有Session也不会创建
        //如果为true:没有Session就会创建一个

        HttpSession mySession = req.getSession(true);

        PrintWriter out = resp.getWriter();

        //生成html文档
        out.println("<html><head><title>Session Info Servlet</title></head>"
                + "<body><h3>session information</h3>"
                + "<b>New Session:</b>" + mySession.isNew()
                + "</br><b>SessionID:</b>" + mySession.getId()

                //显示Session的创建时间
                + "</br><b>Session Create Time:</b>" + new java.util.Date(mySession.getCreationTime())

                //显示Session最后接受的时间
                + "</br><b>Session last accessed time:</b>" + new java.util.Date(mySession.getLastAccessedTime())
                + "<h3>Request Information</h3>"

                //返回随客户端请求到来的会话ID.可能与当前的会话ID相同,也可能不同
                + "</br><b>Session ID from request:</b>" + req.getRequestedSessionId()

                //当前的Session ID如果是从Cookie获得,为true
                + "</br><b>SessionID via Cookie:</b>" + req.isRequestedSessionIdFromCookie()

                //当前Session ID如果是由URL获得,为true
                + "</br><b>SessionID via rewrite URL:</b> " + req.isRequestedSessionIdFromURL()

                //当前客户端的会话ID代表的是有效会话,则返回true.否则(比如,会话过期或根本不存在),返回false
                + "</br><b>valid SessionID:<b>" + req.isRequestedSessionIdValid()

                + "<br><a href=" + resp.encodeUrl("_08_SetSessionServlet") + ">refresh</a>"
                + "</body></html>");

        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

先看看浏览器保存的Cookie,我之前清空了,所以这里为空

运行代码

可以清楚的看到Session
ID的信息.
再看下浏览器保存的Cookie

这里只保存了一个"JSESSIONID",这个相当于一个人的身份证号,通过这个身份证好可以在服务器中找到保存的这个人的各种信息.

刷新一下试试

可以看到 New Session:
         Session last
accessed time:
         SessionID via Cookie:
         valid
SessionID:
         这些信息都变了

浏览器设置为不接受Cookie,点refresh刷新:
        SessionID via rewrite URL:
       
这个信息就会变为true

因为我们是通过Cookie中的SessionID浏览上次的网页的.

Session总结
    1.服务器的一块内存(存key-value)
    2.和客户端窗口对应(子窗口)(独一无二)
   
3.客户端和服务器有对应的SessionID
    4.客户端向服务器端发送SessionID的时候两种方式:
       
1.cookie(内存cookie)
        2.rewriten URL
   
5.浏览器禁掉cookie,就不能使用session(使用cookie实现的session)
   
6.如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写(大大增加编程负担),所以很多网站要求客户端打开cookie

时间: 2024-08-06 11:55:08

Cookie和Session总结的相关文章

cookie和session得区别

1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了. 注:为这个用户创建的Cookie的名称是aspsessionid.这个Cookie的唯一目的就是为每一个用

学习日常笔记&lt;day11&gt;cookie及session

1.会话管理 1.1会话管理定义 会话管理:管理浏览器客户端和服务端之间的会话过程中产生的会话数据 域对象:实现资源之间的数据共享 request 域对象 context 域对象 1.2.会话技术 Cookie技术:会话数据保存在浏览器客户端中 Session技术:会话数据保存在服务器端 2.Cookie技术 2.1 特点 Session技术:会话数据保存在服务器端 2.2Cookie技术核心 Cookie类:用于存储会话数据 1)构造Cookie对象 Cookie(java.lang.Stri

Cookie和Session

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie机制 Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应

cookie、session、sessionid 与jsessionid

cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解. 我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 1. 凭借柜台职员的记忆:由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速知道顾客当前的存款以及存取的次数,每次存取的金额是多少.---- 这种方式表示协议本身支持状态. 2. 使用存折的方式:职员把每个顾客的存款/取款的信息保存在存折上,然后交给顾

cookie、session、localStorage、sessionStorage区别

cookie.session 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. cookie 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话

Node Express 操作( Cookie 和 Session )

1, Cookie 操作, 需要安装 cookie-parser 依赖 => npm i cookie-parser -D 2, 基本使用 // 引入 express let express = require('express'); let cookieParse = require('cookie-parser'); // cookie 依赖 // 创建服务器 var server = express(); server.listen(80); // 响应请求 server.use(cook

http与cookie and session

1.HTTP是计算机通过网络进行通信的规则2.HTTP是一种无状态的协议(不建立持久的连接,服务端不保留连接的相关信息,浏览器发出请求和服务器返回响应是一个没有记忆的过程)3.一个完整的[HTTP请求]过程有7个步骤:1>建立TCP连接2>Web浏览器向Web服务器发送请求命令3>Web浏览器发送请求头信息4>Web服务器应答5>Web服务器发送应答头信息6>Web服务器向浏览器发送数据7>Web服务器关闭TCP连接 http请求:1.HTTP请求的方法或动作,p

cookie 与 session 的区别与联系

1,禁用cookie 后 seesion 还能用吗? cookie是保存在本地的,而seesion是保存在服务器上的.所以两者没有直接的关系,禁用cookie后seesion依然可以用. session的运行依赖于session id,而session id是存在cookie中的.也即,如果客户端禁用了cookie(每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端.实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在H

cookie 和 session

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个