• 对Cookie和Session的深入理解


    session对象

    session对象用于存储特定的用户会话所需的信息 。 Session对象的引入是为了弥补HTTP协议的不足。HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的大卖场之间的关系一样。
     

    cookie分发

    cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
    而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
     

    cookie 和session 的区别

    1、cookie数据存放在客户的浏览器上,
    session数据放在服务器上
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session
    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE
    4、单个cookie在客户端的限制是3~4K,就是说一个站点在客户端存放的COOKIE不能大于限制。
     
    session机制是一种服务器端的机制,服务器使用一种类似于散列表(Hashcode)的结构来保存信息。
    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。
     
    由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764
    另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764
    这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
    为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
     

    HttpServletRequest和HttpSession

    session是在客户端请求服务器自动创建的具有唯一ID的对象。其生存周期从用户第一次请求服务器开始,结束于session失效。
    session失效有以下几种可能性:1、在服务器设定的时间内用户没有请求服务器。2、服务器主动运行session.invalidate()方法使其失效。
    request也是客户端请求服务器时服务器自动生成的对象,用于标志一次请求。其生存周期是客户端请求开始,到服务器返回结果结束。
    两者的区别1、记录的信息不同。2、生存周期不同。sesion的生存周期长于request。
    因此,session常用于报存不同页面的共享信息,如登陆信息等。

    如何获取到session和cookie

    JS有单独的cookie规则
    <script language=javascript> 
    
    //获得coolie 的值
    function cookie(name){    
    
       var cookieArray=document.cookie.split("; "); //得到分割的cookie名值对    
    
       var cookie=new Object();    
    
       for (var i=0;i<cookieArray.length;i++){    
    
          var arr=cookieArray[i].split("=");       //将名和值分开    
    
          if(arr[0]==name)return unescape(arr[1]); //如果是指定的cookie,则返回它的值    
    
       } 
       return ""; 
    }  
    
    function delCookie(name)//删除cookie
    
    {
       document.cookie = name+"=;expires="+(new Date(0)).toGMTString();
    
    }
    function getCookie(objName){//获取指定名称的cookie的值
    
        var arrStr = document.cookie.split("; ");
    
        for(var i = 0;i < arrStr.length;i ++){
    
            var temp = arrStr[i].split("=");
    
            if(temp[0] == objName) return unescape(temp[1]);
       } 
    }
    
    function addCookie(objName,objValue,objHours){      //添加cookie
       var str = objName + "=" + escape(objValue);
        if(objHours > 0){                               //为时不设定过期时间,浏览器关闭时cookie自动消失
            var date = new Date();
            var ms = objHours*3600*1000;
            date.setTime(date.getTime() + ms);
            str += "; expires=" + date.toGMTString();
       }
       document.cookie = str;
    }
    
    function SetCookie(name,value)//两个参数,一个是cookie的名子,一个是值
    {
    
        var Days = 30; //此 cookie 将被保存 30 天
        var exp = new Date();    //new Date("December 31, 9998");
        exp.setTime(exp.getTime() + Days*24*60*60*1000);
        document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
    }
    
    function getCookie(name)//取cookies函数        
    
    {
        var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
         if(arr != null) return unescape(arr[2]); return null;
    }
    function delCookie(name)//删除cookie
    {
    
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval=getCookie(name);
        if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
    }
    </script>
  • 相关阅读:
    来看看面试必问的HashMap,一次彻底帮你搞定HashMap源码
    深入浅出!springboot从入门到精通,实战开发全套教程!
    讲一讲Java的字符串常量池,看完你的思路就清晰了
    面向对象的这些核心技术,你掌握后包你面试无忧
    他凭借这70份PDF,3170页文件,成功斩获了含BATJ所有的offer
    springboot实战开发全套教程,让开发像搭积木一样简单!Github星标已上10W+!
    这行代码告诉你!为什么你地下城与勇士(DNF)的装备强化老是失败?
    精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
    太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?
    putchar(".:-=+*#%@"[(int)(d * 5.0f)])
  • 原文地址:https://www.cnblogs.com/binyue/p/3663731.html
Copyright © 2020-2023  润新知