精华内容
下载资源
问答
  • Session是什么

    2017-12-28 12:53:00
    写的真好,仅供学习积累。原文转发:http://blog.csdn.net/hjc1984117/article/details/53995816 1.session 是啥? 2.怎么保存的? 3.如何运行? 4.有生命周期吗?...一、Session是什么  首先,...

    写的真好,仅供学习积累。原文转发:http://blog.csdn.net/hjc1984117/article/details/53995816

    1.session 是啥?

    2.怎么保存的?

    3.如何运行?

    4.有生命周期吗?

    5.关闭浏览器会过期吗?

    6.Redis代替文件存储session

    7.分布式session的同步问题

     

    一、Session是什么 

      首先,我大致的知道,session是一次浏览器和服务器的交互的会话,会话是啥呢?就是我问候你好吗?你回恩很好。

      就是一次会话,那么对话完成后,这次会话就结束了,还有我也知道,我们可以将一个变量存入全部的$_SESSION['name']中,这样php的各个页面和逻辑都能访问到,所以很轻松的用来判断是否登陆。

     
      这是我之前理解的session,当然也是对的,只是解释的太肤浅,理解的太表面了,面试官如果听到这样的答案其实是不太满意的。
      我参考了其他的很多资料,彻底理解清楚session。
     
      在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是什么?
      我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?
      就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。
     
      所以就会带来一个问题就是,我希望几个请求的页面要有关联,比如:我在www.a.com/login.php里面登陆了,我在www.a.com/index.php 也希望是登陆状态,
      但是,这是2个不同的页面,也就是2个不同的HTTP请求,这2个HTTP请求是无状态的,也就是无关联的,所以无法单纯的在index.php中读取到它在login.php中已经登陆了!
     
      那咋搞呢?我不可能这2个页面我都去登陆一遍吧。或者用笨方法这2个页面都去查询数据库,如果有登陆状态,就判断是登陆的了。
      这种查询数据库的方案虽然可行,但是每次都要去查询数据库不是个事,会造成数据库的压力。
     
      所以正是这种诉求,这个时候,一个新的客户端存储数据方式出现了:cookie。
      cookie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的,只要设置它的存储路径在域名www.a.com下 ,那么当用户用浏览器访问时,
      php就可以从这个域名的任意页面读取cookie中的信息。所以就很好的解决了我在www.a.com/login.php页面登陆了,我也可以在www.a.com/index.php获取到这个登陆信息了。
      同时又不用反复去查询数据库。
     
      虽然这种方案很不错,也很快速方便,但是由于cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。
      那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。
     
      我擦,终于把session是怎么诞生的给圆清楚了,不容易啊!!!
     
      好,session 诞生了,从上面的描述来讲,它就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。
      session信息存在于服务器端,所以也就很好的解决了安全问题。
     
    二、session的运行机制和是怎么保存的?

      既然,它也是一种服务区存储数据的方式,肯定也是存在服务器的某个地方了。确实,它存在服务器的/tmp 目录下,这一点我们接下来慢慢讲。 

      我们先说下它的运行机制,是怎么分配的。我们主要用PHP中session的机制,其实各种语言都差不多。

     
      如果这个时候,我们需要用到session,那我们第一步怎么办呢?第一步是开启session:

      session_start();

      这是个无任何返回值的函数,既不会报错,也不会成功。它的作用是开启session,并随机生成一个唯一的32位的session_id,类似于这样:  

    4c83638b3b0dbf65583181c2f89168ec
    

      session的全部机制也是基于这个session_id,它用来区分哪几次请求是一个人发出的。为什么要这样呢?

      因为HTTP是无状态无关联的,一个页面可能会被成百上千人访问,而且每个人的用户名是不一样的,那么服务器如何区分这次是小王访问的,那次是小名访问的呢?

      所以就有了找个唯一的session_id 来绑定一个用户。一个用户在一次会话上就是一个session_id,这样成千上万的人访问,服务器也能区分到底是谁在访问了。

    我们做个试验,看看,是不是这样的:
     
    我们在php.iyangyi.com 域名下的a.php 页面中,输入如下代码:
     
    
    

    session_start(); echo "SID: ".SID."<br>"; echo "session_id(): ".session_id()."<br>"; echo "COOKIE: ".$_COOKIE["PHPSESSID"];

    我们访问一下a.php页面,看能输出什么?
     
    我们看到居然还有一个警告。我们先一个一个的看。首先SID这个常量,我们没有给它赋值,它居然能有输出,其次session_id()这个系统方法是输出本次生成的session_id。最后$_COOKIE['PHPSESSIID'] 没有值,这个我们接下来说。
     
    好,我们再次刷新这个页面,我们能看到什么?
     
    奇怪的事情发生了。SID 没有值了,$_COOKIE['PHPSESSID']中有值了。而且,2次刷新,session_id 都是一样
    的:bjvlo4p38cfqkr1hr7pe924ts3,实际情况下,只要不关闭网页,怎么刷新都是一样:
     
    既然我们看到COOKIE中有值了,我们,打开firebug开看到底是什么:
     
    而且这个PHPSESSID的过期时间是会话,什么意思呢?就是浏览器只要不关就一直不存,浏览器一关就过期,消失了。
     
    好,我们关掉浏览器,重新打开a.php页面,看看有没有什么变化:
     
     
    你看,是不是又回到当初第一次打开时候的样子。
     
    OK,解惑的时候到了:
     
    每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。
     
    好,这个是session_id,就用来标识绑定一个用户的,既然session_id生成了。那么当我们往session里面写入数据,是如何保存的,答案是保存在服务器的临时目录里,根据php.ini的配置,我机子上的这个session是存在D:\wamp\tmp 目录里的。我们先说是存在这个目录下,然后待会将如何修改。
     
    那么它是怎么存的呢?
     
    同样也是用到session_id。session_id是32位的,服务器会用 sess_前缀 + session_id 的形式存在这个临时目录下,比如上面这个例子:
     
     
     
    所以,每一次生成的session_id都会生成一个这样的文件,用来保存这次会话的session信息。
     
    我们往session里写入些数据,来看看session是怎么往这个文件里写数据的,我们同样在a.php页面继续加上写入session的语句:
     
    $_SESSION['hello'] = 123;
    $_SESSION['word'] = 456;
    然后,我刷新页面,由于我并没有关闭页面,就这是说这次会话还没结束,那么肯定还会是同样的session_id : bjvlo4p38cfqkr1hr7pe924ts3
     
    然后,我们 用编辑器打开它的存储文件sess_bgg20mcl86drbt3j08jg5h5h17这个文件,看看里面是啥?
     
    hello|i:123;word|i:456;
    
    是序列化的数据,我们肉眼也能读出来。当我们往$_SESSION全局变量里写数据时,它会自动往这个文件里写入。读取session的时候,也会根据session_id 找到这个文件,然后读取需要的session变量。
     
    这个sess文件不会随着客户端的PHPSESSID过期,也一起过期掉,它会一直存在,出息GC扫描到它过期或者使用session_destroy()函数摧毁,我们在下面讲到session·回收的时候会说到。
     
    我们大致总结下:
     
    HTTP请求一个页面后,如果用到开启session,会去读cookie中的PHPSESSID是否有,如果没有,则会新生成一个session_id,先存入cookie中的PHPSESSID中,再生成一个sess_前缀文件。当有写入$_SESSION的时候,就会往sess_文件里序列化写入数据。当读取的session变量的时候,先会读取cookie中的PHPSESSID,获得session_id,然后再去找这个sess_sessionid文件,来获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后,会消失,所以,我们重新访问的时候,会新生成session_id和sess_这个文件。
     
    好。session生成和保存将清楚了。我们再来看前面提到的几个变量:
     
     
    echo "SID: ".SID."<br>";
    
    echo "session_id(): ".session_id()."<br>";
    
    echo "COOKIE: ".$_COOKIE["PHPSESSID"];
    
    SID 是一个系统常量,SID包含着会话名以及会话 ID 的常量,格式为 "name=ID",或者如果会话 ID 已经在适cookie 中设定时则为空字符串,第一次显示的时候输出的是SID的值,当你刷新的时候,因为已经在cookie中存在,所以显示的是一个空字符串。
     
    session_id() 函数用来返回当前会话的session_id,它会去读取cookie中的name,也就是PHPSESSID值。
     
     
    session的相关配置
     
    上面巴拉巴拉废话说了那么多,应该是可以理解session的一套机制了的,我接下来看看,前面零星的提到了php.ini里面有关于session相关的配置。我们打开php.ini来,搜索session相关,我主要把用到的几个给列出来:
     
     
    [Session]
    
    session.save_handler = files
    
    session.save_path = "d:/wamp/tmp"
    
    session.use_cookies = 1
    
    session.name = PHPSESSID
    
    session.auto_start = 0
    
    session.cookie_lifetime = 0
    
    session.serialize_handler = php
    
    session.gc_divisor = 1000
    
    session.gc_probability = 1
    
    session.gc_maxlifetime = 1440
    
    主要我们用到的,常见的大概就是这几个。我们一个一个的说。
     
    session.save_handler = files 表示的是session的存储方式,默认的是files文件的方式保存,sess_efdsw34534efsdfsfsf3r3wrresa, 保存在 session.save_path = "d:/wamp/tmp" 里,所有这2个都是可配值得。我们上面的例子就是用的这种默认的方式。
     
    save_handler 不仅仅只能用文件files,还可以用我们常见的memcache 和 redis 来保存。这个我们后面来说。
     
    session.use_cookies 默认是1,表示会在浏览器里创建值为PHPSESSID的session_id,session.name = PHPSESSID 找个配置就是改这个名字的,你可以改成PHPSB, 那这样就再浏览器里生成名字为PHPSB的session_id 。`(*∩_∩*)′
     
    session.auto_start = 0 用来是否需要自动开启session,默认是不开启的,所有我们需要在代码中用到session_start();函数开启,如果设置成1,那么session_id 也会自动就生成了。
     
    session.cookie_lifetime = 0 这个是设置在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id。所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位是秒。
     
    gc_divisor, gc_probability, gc_maxlifetime 这3个也是配合一起使用,他们是干嘛的呢?他们是干大事情的,回收这些sess_xxxxx 的文件,它是按照这3个参数,组成的比率,来启动GC删除这些过期的sess文件。gc_maxlifetime是sess_xxx文件的过期时间。具体可以参考这个,我觉得他说我比我清楚: session的垃圾回收机制
     
    session的垃圾回收
     
    我们通过上面的各种,已经清楚session的种种了,它会产生各种的sess_前缀的文件,久而久之就会形成垃圾数据,而且正常的session读取也会造成压力,所以及时的清理是蛮有用的。
     
    1. 代码处理
     
    php代码中有几个函数是用来清理过期的session信息的,主要是这几个:
     
    unset($_SESSION['hello']);
    session_unset();
    session_destroy();
    
    setcookie(session_name(), '', time()-42000, '/');
    
    unset 这是是常用的销毁标量的方法,不多说,唯一要说的是删除session ,就是将这个sess_xxx的文件的hello变量给删除了,其他的变量该有的都保存着。而 session_unset() 这个不穿参数,这个是销毁sess_xxx文件中的所有变量,但是这个sess_xxx文件还是保存着。而session_destroy 则更狠角了,它是直接将这个sess_xxx文件给删掉。
     
    一般退出操作里面,我们也会将session_name() 获得到的PHPSESSID也给过期掉,删掉,因为网页没关,不这样删除的话,刷新之后,找个值是存在的,服务器将会重新创建一个一模一样session_id的sess文件。
     
    2. php gc 自动删除
     
    php.ini中的几个销毁sess_xxx文件的配置,在上面说了:
     
    session.gc_divisor = 1000
    session.gc_probability = 1
    session.gc_maxlifetime = 1440
    
    简单说下,其实上面的一个超链接的博客讲的很清楚了,php触发gc删除过期的sess_x的文件的概念是这样计算的:概率= gc_probability/gc_divisor,上面的默认的参数,也就是说概念是1/1000的概念,在页面启动session_start() 函数时候,会触发gc删除过期的sess_文件。这个概率其实是蛮小的
     
    所以,我们可以将这个概念调整大一点,比如:将gc_probability 也调成1000,那gc_probability/gc_divisor 就等于1了,也就是百分一百会触发。这样就垃圾回收概率就大的多。
     
     

    用redis存储session
     
    上面七七八八说了很多关于session的存储啊机制啊等。现在说说如果用redis 存储session。之前说的都是用文件files存储,现在想用redis,好处有哪些?
    1. 更快的读取和写入速度。redis是直接操纵内存数据的,肯定是要比文件的形式快很多。
    2. 更好的设置好过期时间。文件存储的sess_sdewfrsf文件其实被删除掉还是要考运气的和概率的,很有可能造成sess_文件没即时删除,造成存储磁盘空间过多,和读取SESSION就变慢了。
    3. 更好的分布式同步。设置redis 的主从同步,可以快速的同步session到各台web服务器,比文件存储更加快速。
    总的说来,用redis来存储SESSION速度更快,性能更高。
     
    要做的第一件事,当然就是安装redis了。具体安装和配置php与redis,就不细说了,可以参考我写的redis相关:redis安装与配置
     
    redis 安装好了之后,接下来就是修改php.ini了。将原来的files 改成redis:
     
    session.save_handler = redis
    
    session.save_path = "tcp://127.0.0.1:6381"
    
    需要用到tcp来连接redis,如果你设置reids 有密码访问的话,这样加上就可以了:tcp://127.0.0.1:6381?auth=authpwd
     
    重启web服务器后,你就可以正常使用SESSION了。和之前使用files存储SESSION一模一样。
     
    我们看下redis 是怎么存储session的。它是用了有别于文件存储使用sess_前缀的名字,它用PHPREDIS_SESSION: 前缀,再加上session_id 的形式,是一个string 字符串类型,带生存周期的。
     
    PHPREDIS_SESSION:i9envsatpki9q8kic7m4k68os5
     
     
    你会发现,它的值和文件存储session一模一样,都是用php序列化后存储,而且有明确的过期时间,是根据配置:session.gc_maxlifetime = 1440 来设定的,默认1440秒。当然你可以修改成其他的。
     
    我们写入和读取每页还是一模一样,包括删除和情况,都是一模一样,没有什么变化:
     
    session_start(); //开启session,如果读不到cookie,会重新生成一个session_id,redis里面也会新生成一个。
    
    echo "SID: ".SID."<br>";
    
    echo "session_id(): ".session_id()."<br>";
    
    echo "COOKIE: ".$_COOKIE["PHPSESSID"];
    
    $_SESSION['hello'] = 123; // 写入session 。会序列化后写入redis中
    $_SESSION['word'] = 456;
    
    var_dump($_SESSION['word']);  //读session。会从redis读到,解序列后,读出这个值。redis 1440秒过期后,将读不到。
    unset($_SESSION['hello']);  // 删除 hello 的session 。会删除 redis的hello值
    session_unset();  // 清空redis 中这个session_id的所有值。
    session_destroy(); // 删除掉这个PHPREDIS_SESSION:i9envsatpki9q8kic7m4k68os5 key。
    
    session同步
     
    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果不同的服务器用的是不同的reidis服务,那么可能就会出现,一个登录用户,一会是登录状态,一会又不是登录状态。所以session这个时候就要同步了。刚好,我们选择用redis作为了存储,是可以在多台redis 服务器中同步的。
     
    具体可以搜索 reidis主从同步或者redis 集群

     原文:http://blog.csdn.net/hjc1984117/article/details/53995816

    转载于:https://www.cnblogs.com/dump/p/8135133.html

    展开全文
  • session是什么

    万次阅读 多人点赞 2017-01-03 16:45:40
    今天就来彻底的学一些session是个啥东西,我罗列了几个需要知道的要点: 1.session 是啥? 2.怎么保存的? 3.如何运行? 4.有生命周期吗? 5.关闭浏览器会过期吗? 6.Redis代替文件存储session ...

    前言:

    今天就来彻底的学一些session是个啥东西,我罗列了几个需要知道的要点:

    1.session 是啥?
    2.怎么保存的?

    3.如何运行?

    4.有生命周期吗?

    5.关闭浏览器会过期吗?

    6.Redis代替文件存储session

    7.分布式session的同步问题


    session是啥?


    首先,我大致的知道,session是一次浏览器和服务器的交互的会话,会话是啥呢?就是我问候你好吗?你回恩很好。就是一次会话,那么对话完成后,这次会话就结束了,还有我也知道,我们可以将一个变量存入全部的$_SESSION['name']中,这样php的各个页面和逻辑都能访问到,所以很轻松的用来判断是否登陆。

    这是我之前理解的session,当然也是对的,只是解释的太肤浅,理解的太表面了,面试官如果听到这样的答案其实是不太满意的。我参考了其他的很多资料,彻底理解清楚session。

    在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是什么?我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。

    所以就会带来一个问题就是,我希望几个请求的页面要有关联,比如:我在www.a.com/login.php里面登陆了,我在www.a.com/index.php 也希望是登陆状态,但是,这是2个不同的页面,也就是2个不同的HTTP请求,这2个HTTP请求是无状态的,也就是无关联的,所以无法单纯的在index.php中读取到它在login.php中已经登陆了!

    那咋搞呢?我不可能这2个页面我都去登陆一遍吧。或者用笨方法这2个页面都去查询数据库,如果有登陆状态,就判断是登陆的了。这种查询数据库的方案虽然可行,但是每次都要去查询数据库不是个事,会造成数据库的压力。

    所以正是这种诉求,这个时候,一个新的客户端存储数据方式出现了:cookie。cookie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的,只要设置它的存储路径在域名www.a.com下 ,那么当用户用浏览器访问时,php就可以从这个域名的任意页面读取cookie中的信息。所以就很好的解决了我在www.a.com/login.php页面登陆了,我也可以在www.a.com/index.php获取到这个登陆信息了。同时又不用反复去查询数据库。

    虽然这种方案很不错,也很快速方便,但是由于cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。

    我擦,终于把session是怎么诞生的给圆清楚了,不容易啊!!!

    好,session 诞生了,从上面的描述来讲,它就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,所以也就很好的解决了安全问题。

    session的运行机制和是怎么保存的?


    既然,它也是一种服务区存储数据的方式,肯定也是存在服务器的某个地方了。确实,它存在服务器的/tmp 目录下,这一点我们接下来慢慢讲。

    我们先说下它的运行机制,是怎么分配的。我们主要用PHP中session的机制,其实各种语言都差不多。

    如果这个时候,我们需要用到session,那我们第一步怎么办呢?第一步是开启session:

    session_start();

    这是个无任何返回值的函数,既不会报错,也不会成功。它的作用是开启session,并随机生成一个唯一的32位的session_id,类似于这样:

    4c83638b3b0dbf65583181c2f89168ec
    session的全部机制也是基于这个session_id,它用来区分哪几次请求是一个人发出的。为什么要这样呢?因为HTTP是无状态无关联的,一个页面可能会被成百上千人访问,而且每个人的用户名是不一样的,那么服务器如何区分这次是小王访问的,那次是小名访问的呢?所以就有了找个唯一的session_id 来绑定一个用户。一个用户在一次会话上就是一个session_id,这样成千上万的人访问,服务器也能区分到底是谁在访问了。

    我们做个试验,看看,是不是这样的:

    我们在php.iyangyi.com 域名下的a.php 页面中,输入如下代码:

    session_start(); echo "SID: ".SID."<br>"; echo "session_id(): ".session_id()."<br>"; echo "COOKIE: ".$_COOKIE["PHPSESSID"];

    我们访问一下a.php页面,看能输出什么?


    我们看到居然还有一个警告。我们先一个一个的看。首先SID这个常量,我们没有给它赋值,它居然能有输出,其次session_id()这个系统方法是输出本次生成的session_id。最后$_COOKIE['PHPSESSIID'] 没有值,这个我们接下来说。

    好,我们再次刷新这个页面,我们能看到什么?


    奇怪的事情发生了。SID 没有值了,$_COOKIE['PHPSESSID']中有值了。而且,2次刷新,session_id 都是一样
    的:bjvlo4p38cfqkr1hr7pe924ts3,实际情况下,只要不关闭网页,怎么刷新都是一样:

    既然我们看到COOKIE中有值了,我们,打开firebug开看到底是什么:


    而且这个PHPSESSID的过期时间是会话,什么意思呢?就是浏览器只要不关就一直不存,浏览器一关就过期,消失了。

    好,我们关掉浏览器,重新打开a.php页面,看看有没有什么变化:



    你看,是不是又回到当初第一次打开时候的样子。

    OK,解惑的时候到了:

    每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。

    好,这个是session_id,就用来标识绑定一个用户的,既然session_id生成了。那么当我们往session里面写入数据,是如何保存的,答案是保存在服务器的临时目录里,根据php.ini的配置,我机子上的这个session是存在D:\wamp\tmp 目录里的。我们先说是存在这个目录下,然后待会将如何修改。

    那么它是怎么存的呢?

    同样也是用到session_id。session_id是32位的,服务器会用 sess_前缀 + session_id 的形式存在这个临时目录下,比如上面这个例子:




    所以,每一次生成的session_id都会生成一个这样的文件,用来保存这次会话的session信息。

    我们往session里写入些数据,来看看session是怎么往这个文件里写数据的,我们同样在a.php页面继续加上写入session的语句:

    $_SESSION['hello'] = 123;
    $_SESSION['word'] = 456;
    然后,我刷新页面,由于我并没有关闭页面,就这是说这次会话还没结束,那么肯定还会是同样的session_id : bjvlo4p38cfqkr1hr7pe924ts3

    然后,我们 用编辑器打开它的存储文件sess_bgg20mcl86drbt3j08jg5h5h17这个文件,看看里面是啥?

    hello|i:123;word|i:456;
    
    是序列化的数据,我们肉眼也能读出来。当我们往$_SESSION全局变量里写数据时,它会自动往这个文件里写入。读取session的时候,也会根据session_id 找到这个文件,然后读取需要的session变量。

    这个sess文件不会随着客户端的PHPSESSID过期,也一起过期掉,它会一直存在,出息GC扫描到它过期或者使用session_destroy()函数摧毁,我们在下面讲到session·回收的时候会说到。

    我们大致总结下:

    HTTP请求一个页面后,如果用到开启session,会去读cookie中的PHPSESSID是否有,如果没有,则会新生成一个session_id,先存入cookie中的PHPSESSID中,再生成一个sess_前缀文件。当有写入$_SESSION的时候,就会往sess_文件里序列化写入数据。当读取的session变量的时候,先会读取cookie中的PHPSESSID,获得session_id,然后再去找这个sess_sessionid文件,来获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后,会消失,所以,我们重新访问的时候,会新生成session_id和sess_这个文件。

    好。session生成和保存将清楚了。我们再来看前面提到的几个变量:


    echo "SID: ".SID."<br>";
    
    echo "session_id(): ".session_id()."<br>";
    
    echo "COOKIE: ".$_COOKIE["PHPSESSID"];
    
    SID 是一个系统常量,SID包含着会话名以及会话 ID 的常量,格式为 "name=ID",或者如果会话 ID 已经在适cookie 中设定时则为空字符串,第一次显示的时候输出的是SID的值,当你刷新的时候,因为已经在cookie中存在,所以显示的是一个空字符串。

    session_id() 函数用来返回当前会话的session_id,它会去读取cookie中的name,也就是PHPSESSID值。


    session的相关配置

    上面巴拉巴拉废话说了那么多,应该是可以理解session的一套机制了的,我接下来看看,前面零星的提到了php.ini里面有关于session相关的配置。我们打开php.ini来,搜索session相关,我主要把用到的几个给列出来:


    [Session]
    
    session.save_handler = files
    
    session.save_path = "d:/wamp/tmp"
    
    session.use_cookies = 1
    
    session.name = PHPSESSID
    
    session.auto_start = 0
    
    session.cookie_lifetime = 0
    
    session.serialize_handler = php
    
    session.gc_divisor = 1000
    
    session.gc_probability = 1
    
    session.gc_maxlifetime = 1440
    
    主要我们用到的,常见的大概就是这几个。我们一个一个的说。

    session.save_handler = files 表示的是session的存储方式,默认的是files文件的方式保存,sess_efdsw34534efsdfsfsf3r3wrresa, 保存在 session.save_path = "d:/wamp/tmp" 里,所有这2个都是可配值得。我们上面的例子就是用的这种默认的方式。

    save_handler 不仅仅只能用文件files,还可以用我们常见的memcache 和 redis 来保存。这个我们后面来说。

    session.use_cookies 默认是1,表示会在浏览器里创建值为PHPSESSID的session_id,session.name = PHPSESSID 找个配置就是改这个名字的,你可以改成PHPSB, 那这样就再浏览器里生成名字为PHPSB的session_id 。`(*∩_∩*)′

    session.auto_start = 0 用来是否需要自动开启session,默认是不开启的,所有我们需要在代码中用到session_start();函数开启,如果设置成1,那么session_id 也会自动就生成了。

    session.cookie_lifetime = 0 这个是设置在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id。所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位是秒。

    gc_divisor, gc_probability, gc_maxlifetime 这3个也是配合一起使用,他们是干嘛的呢?他们是干大事情的,回收这些sess_xxxxx 的文件,它是按照这3个参数,组成的比率,来启动GC删除这些过期的sess文件。gc_maxlifetime是sess_xxx文件的过期时间。具体可以参考这个,我觉得他说我比我清楚: session的垃圾回收机制

    session的垃圾回收

    我们通过上面的各种,已经清楚session的种种了,它会产生各种的sess_前缀的文件,久而久之就会形成垃圾数据,而且正常的session读取也会造成压力,所以及时的清理是蛮有用的。

    1. 代码处理

    php代码中有几个函数是用来清理过期的session信息的,主要是这几个:

    unset($_SESSION['hello']);
    session_unset();
    session_destroy();
    
    setcookie(session_name(), '', time()-42000, '/');
    
    unset 这是是常用的销毁标量的方法,不多说,唯一要说的是删除session ,就是将这个sess_xxx的文件的hello变量给删除了,其他的变量该有的都保存着。而 session_unset() 这个不穿参数,这个是销毁sess_xxx文件中的所有变量,但是这个sess_xxx文件还是保存着。而session_destroy 则更狠角了,它是直接将这个sess_xxx文件给删掉。

    一般退出操作里面,我们也会将session_name() 获得到的PHPSESSID也给过期掉,删掉,因为网页没关,不这样删除的话,刷新之后,找个值是存在的,服务器将会重新创建一个一模一样session_id的sess文件。

    2. php gc 自动删除

    php.ini中的几个销毁sess_xxx文件的配置,在上面说了:

    session.gc_divisor = 1000
    session.gc_probability = 1
    session.gc_maxlifetime = 1440
    
    简单说下,其实上面的一个超链接的博客讲的很清楚了,php触发gc删除过期的sess_x的文件的概念是这样计算的:概率= gc_probability/gc_divisor,上面的默认的参数,也就是说概念是1/1000的概念,在页面启动session_start() 函数时候,会触发gc删除过期的sess_文件。这个概率其实是蛮小的

    所以,我们可以将这个概念调整大一点,比如:将gc_probability 也调成1000,那gc_probability/gc_divisor 就等于1了,也就是百分一百会触发。这样就垃圾回收概率就大的多。


    用redis存储session

    上面七七八八说了很多关于session的存储啊机制啊等。现在说说如果用redis 存储session。之前说的都是用文件files存储,现在想用redis,好处有哪些?
    1. 更快的读取和写入速度。redis是直接操纵内存数据的,肯定是要比文件的形式快很多。
    2. 更好的设置好过期时间。文件存储的sess_sdewfrsf文件其实被删除掉还是要考运气的和概率的,很有可能造成sess_文件没即时删除,造成存储磁盘空间过多,和读取SESSION就变慢了。
    3. 更好的分布式同步。设置redis 的主从同步,可以快速的同步session到各台web服务器,比文件存储更加快速。
    总的说来,用redis来存储SESSION速度更快,性能更高。

    要做的第一件事,当然就是安装redis了。具体安装和配置php与redis,就不细说了,可以参考我写的redis相关:redis安装与配置

    redis 安装好了之后,接下来就是修改php.ini了。将原来的files 改成redis:

    session.save_handler = redis
    
    session.save_path = "tcp://127.0.0.1:6381"
    
    需要用到tcp来连接redis,如果你设置reids 有密码访问的话,这样加上就可以了:tcp://127.0.0.1:6381?auth=authpwd

    重启web服务器后,你就可以正常使用SESSION了。和之前使用files存储SESSION一模一样。

    我们看下redis 是怎么存储session的。它是用了有别于文件存储使用sess_前缀的名字,它用PHPREDIS_SESSION: 前缀,再加上session_id 的形式,是一个string 字符串类型,带生存周期的。

    PHPREDIS_SESSION:i9envsatpki9q8kic7m4k68os5



    你会发现,它的值和文件存储session一模一样,都是用php序列化后存储,而且有明确的过期时间,是根据配置:session.gc_maxlifetime = 1440 来设定的,默认1440秒。当然你可以修改成其他的。

    我们写入和读取每页还是一模一样,包括删除和情况,都是一模一样,没有什么变化:

    session_start(); //开启session,如果读不到cookie,会重新生成一个session_id,redis里面也会新生成一个。
    
    echo "SID: ".SID."<br>";
    
    echo "session_id(): ".session_id()."<br>";
    
    echo "COOKIE: ".$_COOKIE["PHPSESSID"];
    
    $_SESSION['hello'] = 123; // 写入session 。会序列化后写入redis中
    $_SESSION['word'] = 456;
    
    var_dump($_SESSION['word']);  //读session。会从redis读到,解序列后,读出这个值。redis 1440秒过期后,将读不到。
    unset($_SESSION['hello']);  // 删除 hello 的session 。会删除 redis的hello值
    session_unset();  // 清空redis 中这个session_id的所有值。
    session_destroy(); // 删除掉这个PHPREDIS_SESSION:i9envsatpki9q8kic7m4k68os5 key。
    
    session同步

    在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果不同的服务器用的是不同的reidis服务,那么可能就会出现,一个登录用户,一会是登录状态,一会又不是登录状态。所以session这个时候就要同步了。刚好,我们选择用redis作为了存储,是可以在多台redis 服务器中同步的。

    具体可以搜索 reidis主从同步或者redis 集群



    参考资料:

    http://zhidao.baidu.com/link?url=2_phukSt0xI6SSIVKUE37TxzivLqdCz_JCPhIUPLMB3TX_IWgoVKL2lwDn1Gh7xTykyV3ezU1YQv9s6HD3uhO_

    http://blog.sina.com.cn/s/blog_5f54f0be0100xs7e.html

    http://star0708.blog.163.com/blog/static/181091248201341710100381/

    http://baike.baidu.com/view/25258.htm?fr=aladdin

    http://www.cnblogs.com/hongfei/archive/2012/06/17/2552434.html

    展开全文
  • session 是什么

    2012-05-04 09:11:46
    在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的transaction与session在某些语境下的含义相同的。  session,中文经常翻译为会话,其本来的含义指有始有终的一系列动作/消息,...
    session的工作原理 
    一、术语session 
    在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。 

    session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。 

    然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”③。 

    而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。 

    鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 
    在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥ 

    二、HTTP协议与状态保持 
    HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。 

    然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 

    让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案: 
    1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 
    2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 
    3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 

    由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 

    三、理解cookie机制 
    cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。 

    正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。 

    而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。 

    cookie的内容主要包括:名字,值,过期时间,路径和域。 
    其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。 
    路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。 
    路径与域合在一起就构成了cookie的作用范围。 
    如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。 

    存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。 

    下面就是一个goolge设置cookie的响应头的例子 
    HTTP/1.1 302 Found 
    Location: http://www.google.com/intl/zh-CN/ 
    Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com 
    Content-Type: text/html 

    这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分 

    浏览器在再次访问goolge的资源时自动向外发送cookie 

    使用Firefox可以很容易的观察现有的cookie的值 
    使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。 

    IE也可以设置在接受cookie前询问 

    这是一个询问接受cookie的对话框。 

    四、理解session机制 
    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 

    当程序需要为某个客户端的请求创建一个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。 

    另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单 

    在被传递给客户端之前将被改写成 

    这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。 
    实际上这种技术可以简单的用对action应用URL重写来代替。 

    在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 

    恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 


    转自:http://blog.csdn.net/kgd1120/article/details/2159458

    展开全文
  • session是什么

    2017-06-05 09:22:42
    Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个...

    Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。


      这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果
    返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。除了SessionID,在每个Session中还包含很多其他信息。

     

    1.设置session

    java里面,可以给session添加自定义key,value(HttpServletRequest request 作为方法的输入参数)

    HttpSession session = request.getSession();
    session.setAttribute("usrid", userid);

    2.取得session

    jsp里面可以   这段来源自CSDN一个讨论贴,自己时间后并没有成功,报错是session is undifiened,后来又找了资料说 javascript不提供访问session的功能。session只能通过动态程序操作,可以使用ajax给javascript返回值。

    session.getAttribute("username");

    java里面可以 (HttpServletRequest request 作为方法的输入参数)

    HttpSession session = request.getSession(); 
    session.getAttribute("usrname");

     

    一个使用session进行超时访问控制的实例

    (1)LoginServlet.java 在登录时,设置session属性

    复制代码
     public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws IOException, ServletException {  
             
            String userid = request.getParameter("username");
            String pwd = request.getParameter("password");
            
            JSONObject json = new JSONObject();  
            
            AdminDAO adminDAO = new AdminDAO();
            List<Admin> userList = adminDAO.findByProperty("usrid", userid);
    
            if(userList.get(0).getPassword().equals(pwd)){
                 json.put("success", true);
                 HttpSession session = request.getSession();
                 session.setAttribute("usrid", userid);
            } else {
                 json.put("success", false);
                 json.put("meg", "sorry");
            }          
                     
            PrintWriter pw = response.getWriter();   
            pw.print(json.toString());  
            pw.close();  
        }  
    复制代码

     (2)HomePage.java 在跳转到相关页面时,获取并判断session

    复制代码
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            JSONObject json = new JSONObject();  
           
            HttpSession session = request.getSession(); 
            if(session==null||session.getAttribute("usrid")==null)
            {
                 json.put("success", false);
                 json.put("meg", "Time out,please login again!");
            }
            else
            {
               ...
                json.put("jsonArray", array);     
            }    
            
               
            PrintWriter pw = response.getWriter();   
            pw.print(json.toString());  
            pw.close();
        }
    复制代码

     (3)homePage.html 页面根据(2)的返回值判断是否执行跳转操作

    复制代码
    $(document).ready(function(){
                $.ajax({
                    url: "HomePageServlet",
                    type: "post",
                    dataType: "json",
                    success: function(data) {        
                    if (data["success"]) {
                          ...
                    } 
                    else
                    {
                        alert(data["meg"]);
                        window.location.href="login.html";
                    }                            
                }
                    
            });
        });
    展开全文
  • Java Web Session是什么

    2019-09-14 16:08:43
    session是什么? session的生成步骤。 session的常用方法。 session和cookie的区别。
  • session是什么 截取自:http://www.hackervip.com/Article/HTML/11744.html PHP中session全面教程 作者:znsoft 一、session概述 session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序,...
  • session是什么?

    千次阅读 多人点赞 2018-04-08 16:26:42
    首先,我大致的知道,session是一次浏览器和服务器的交互的会话,会话是啥呢?就是我问候你好吗?你回恩很好。就是一次会话,那么对话完成后,这次会话就结束了,还有我也知道,我们可以将一个变量存入全部的$...
  • 因为HTTP协议是无状态的协议,但我们需要保存客户端在多次请求之间状态信息的...session是用来传值的,当用户打开浏览器后,就会产生一个sessionid,并一直保持到浏览器关闭为止,在期间,可以用session来传值,但是...
  • hibernate session是什么

    2016-07-06 17:10:48
    首先session 一个接口 在内部生命了一些集合 这些集合所构成的就是session缓存; session通过sessionFactory.openSession()得到; 通过session就可以对数据库进行增删改查的操作,涉及到的方法有save(),delete...
  • 2.session是一次浏览器和服务器的交互的会话,第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器,session信息存在于服务器端3.sessionStorage, webstorage特性的API...
  • Session在计算机中,尤其在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户...
  • session:多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session)。建立了一次tcp的连接,但是...有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:Cookies一...
  • 今天就来彻底的学一些session是个啥东西,我罗列了几个需要知道的要点: 1.session 是啥? 2.怎么保存的? 3.如何运行? 4.有生命周期吗? 5.关闭浏览器会过期吗? 6.redis代替文件存储session 7.分布式session的...
  • 为什么有session?...比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http...
  • Cookie和Session是什么?它们的区别是什么?

    千次阅读 多人点赞 2019-02-28 13:09:46
    什么是Cookie? Cookie实际上一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 当浏览器再请求该网站时,浏览器把...
  • session是什么时候创建的?

    万次阅读 多人点赞 2017-08-07 19:02:31
    现在让我从session开始慢慢捡起来javaweb的基本原理吧。  先介绍一下测试环境:   其中servlet和jsp都默认内容。  测试1:分别请求servlet和jsp,通过浏览器查看是否生成session。  测试结果:请求servlet...
  • 许多时候我们在咨询百度或者解决一个问题的时候都会碰到如果这篇文章篇幅太长,让我们心里就会望而止步,产生厌烦,这里我想陈述一下,如果这篇文章不是你的工作领域,可以放弃,但是如果,就要考虑这篇文章的内容...
  • Session是什么

    千次阅读 2007-11-06 10:41:00
    一、术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的transaction与session在某些语境下的含义相同的。 session,中文经常翻译为会话,其本来的含义指有始有终的一系列...
  • 什么是Cookie Cookie实际上一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 HTTP协议本身无状态的,这与HTTP...
  • web 中的session是什么?

    2011-07-29 11:05:53
    在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。 具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所...
  • HttpContext.Current.Session是什么??

    千次阅读 2013-03-16 10:43:48
    HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息。 在类中使用Session时必须使用HttpContext.Current.Session方法来引用,而在页面中使用则可以直接使用Session
  • 我在一个servlet中,...我写了个session监听器,发现第一次访问监听器有反应,之后就算重启了Tomcat也都不再触发到监听器了,就是说不再创建新的Session,浏览器这边的cookie,sessionID也一直原先那个。 求解释。
  • 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,997
精华内容 7,598
关键字:

session是什么