zoukankan      html  css  js  c++  java
  • Cookie和Session的总结

    1、开篇

    在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候。之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的知识。

    昨天我鼓起勇气,看了一些网上的资料了一些之前学习的资料,对着两个知识点进行一个小总结。希望可以帮助到观看这篇随笔的读者们。

    2、Cookie和Session的介绍 (会话管理技术概述)

    (1) 什么是会话?
     这里的会话指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。
    例如:

    我们去网吧上网,在吧台拿到用户名和密码,然后找机器登录,这时候机器就认识了我们,我们就可以开始上网,这就相当于我们开启了一次上网的会话,当我们点击结束下机(或者遇到关机重启),

    或者上网时间到了,这时候机器就不再认识我们,那么就叫会话结束。


    (2)会话管理技术能做什么?

    共享同一个客户浏览器多个请求中数据,例如购物车。(简单权限过滤)

    3、会话管理技术一(Cookie)

    (1)什么是cookie?

    它是客户端浏览器的缓存文件,里面记录了客户端浏览器访问网站的一些内容。它也是Http协议请求和响应消息头的一部分。

    (2)cookie能做什么?

    能保存客户端浏览器访问网站的相关内容,需要服务器开启cookie。从而每一次访问时,先从本地获取缓存,使用资源共享,并且提高效率。

    (3)Cookie的说明。

    Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。(32bit 不能超过4096MB)同时,所有网站的cookie总数不超过300个。

    (4)Cookie中的属性
            属性:
                name:必要属性,cookie的名称。
                value:必要属性,cookie的值(不能是中文)
                ---------------------------可选属性---------------------------------
                path:cookie的路径(重要)
                domain:cookie的域名(重要),相当于访问的网站(localhost)
                maxAge:cookie的生存时间(相当于生命周期的活着)(比较重要),
                         当删除cookie时,设置该值为0。
                         当不设置该值时,使用的是浏览器的内存,当关闭浏览器之后,cookie将丢失。设置了此值,就会保存成缓存文件(值必须是大于0的,以秒为单位)。
                version:cookie的版本号。(不重要)
                comment:cookie的说明。(不重要)


    (5) 在web应用中如何设置和获取Cookie
            定义一个Cookie
                Cookie  cookie  =  new  Cookie(cookieName,cookieValue);
            HttpServletRequest 获取 Cookie
                Cookie[]  cookies = request.getCookies();
                该方法返回的是一个数组。(为什么是数组呢,方便,可以直接拿到与该请求相关的所有cookie)
            HttpServletResponse 添加Cookie
                response.addCookie(cookie);
            添加一个cookie,其实就是添加一个响应消息头
                    response.setHeader("Set-Cookie","name=value;path=;maxage=;domain=");
            (为什么没有set方法,原因是set就会把之前的覆盖,所以每次都是添加)。
            如何确定一个唯一的cookie:cookieName+cookiePath+cookieDomain
            定位一个cookie是由 cookie的名称和路径,主机(访问的资源)三部分组成


    4、会话管理技术二(Session)--Tomcat的默认过期时间是30分钟。
    (1)什么是Session?
                它是一个服务端会话对象,存储用户的会话数据。

    (2)获取session的两种方式
                方式一:request:getSession();

        查看是否有jsessionid;1)有通过jsessionid获取session;2)有这块区域就直接用了。

                                                                                   2) 没有这块区域就开辟一块session区域。

                                       1)没有直接开辟一块session的区域。

                方式二:request:getSession(Boolean b);true和上面的方法一样,下面是false的解释。

        查看是否有jsessionid;1)有通过jsessionid获取session;2)有这块区域就直接用了。

                                                                                   2) 没有直接返回null

                                       1)没有直接返回null

    (3)HttpSession对象的状态
            a、什么是持久态
                把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。
                我们把HttpSession持久态也叫做钝化。(与钝化相反的,我们叫活化。)
            b、什么时候使用持久化
                第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。
                第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化。

     

    5、关于jsessionid说明

    当我们在JAVA后台获取到一块session空间的时候,返回时已经将这块session的id也就是jsessionid代入到浏览器的cookie中(前提是cookie打开),如果你的浏览器cookie没有打开,

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
              //将字符集设置,放在方法体首位
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("text/html;UTF-8");
            HttpSession session = request.getSession();
            System.out.println(session);
            String reUrl = response.encodeRedirectURL("TestServlet");//浏览器cookie没有打开只用这个方法,可以在url后面加上jsessionid,保持会话的持续,注意的是需要所有的跳转都加上这个方法才可以保持jsessionid的拼接
            response.sendRedirect(reUrl);
        }

     

    例如:http://localhost:8080/ssm/TestServlet;jsessionid=059A89AE1D32790B3DB6C61C5E138DD1

            带jsessionid的url到后台后,可直接获取session,如果存在获取到的session对象是和之前一样的对象。

     

    打印结果:

    一月 04, 2017 11:16:10 上午 org.apache.catalina.core.StandardContext reload
    信息: Reloading Context with name [/ssm] is completed
    aaaaaaaaaaaaaaa
    org.apache.catalina.session.StandardSessionFacade@194c6bd
    org.apache.catalina.session.StandardSessionFacade@194c6bd
    一月 04, 2017 11:16:18 上午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring FrameworkServlet 'appServlet'
    一月 04, 2017 11:16:18 上午 org.springframework.web.servlet.FrameworkServlet initServletBean
    信息: FrameworkServlet 'appServlet': initialization started

     

  • 相关阅读:
    [MySql]insert...select 8/10
    秀出Administrator帳戶6/27
    Love
    讀取Gridview的隱藏欄8/22
    水晶報表公式換行8/2
    MySql.Data.MySqlClient.MySqlException 7/9
    mysql的錯誤日誌爆满7/24
    从汇编看c++中的const常量
    可见性和生命期的区别
    比较烦
  • 原文地址:https://www.cnblogs.com/taotingkai/p/6247950.html
Copyright © 2011-2022 走看看