新技术论坛
搜索
查看: 1156|回复: 0
打印 上一主题 下一主题

[PHP] 单点登录系列之——HTTP请求与Cookie讲解

[复制链接]
  • TA的每日心情
    开心
    2016-12-9 18:18
  • 签到天数: 85 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2017-1-11 06:52:59 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
      
      HTTP、Cookie、Session
      HTTP协议作为无状态协议,无状态并不陌生,EJB
      bean中就有有状态、无状态之分,对于HTTP协议而言,无状态同样指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息。那么问题来了,既然无状态,那完成一套完整的业务逻辑,发送多次请求的情况数不胜数,使用http如何将上下文请求进行关联呢?机智的人类通过优化,找到了一种简单的方式记录http协议的请求信息
      优化后的HTTP请求:

      浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID,协同response一并返回给浏览器。
      同时服务器在本地创建一个MAP结构,专门以key-value(请求ID-会话内容)形式将每个request进行存储
      此时浏览器的request已经被赋予了一个ID,第二次访问时,服务器先从request中查找该ID,根据ID查找维护会话的content内容,该内容中记录了上一次request的信息状态。
      根据查找出的request信息生成基于这些信息的response内容,再次返回给浏览器。如果有需要会再次更新会话内容,为下一次请求提供准备。
      所以根据这个会话ID,以建立多次请求-响应模式的关联数据传递。说到这里可能已经唤起了大家许多共鸣。这就是cookie和session对无状态的http协议的强大作用。服务端生成这个全局的唯一标识,传递给客户端用于唯一标记这次请求,也就是cookie;而服务器创建的那个map结构就是session。所以,cookies由服务端生成,用于标记客户端的唯一标识,无特定含义,在每次网络请求中,都会被传送。session服务端自己维护的一个map数据结构,记录key-content上下文内容状态。
      Cookie7大属性
      Name和value是cookie最常用的两个属性,也是用于标识当前cookie的id和对应内容的属性。
      Expires
      用于设置cookie生命周期。
      Pathdomain
      Path和domain是针对于不同路径、跨域请求中对cookie进行设置的属性。举个简单的例子,浏览器访问百度的cookie一定不会发送给新浪网;访问百度新闻时登录的信息同样可以用于百度网盘,虽然他们并非同一请求路径下生成的cookie。这就是cookie的域和路径的属性。浏览器发出请求时,会根据cookie的domain和path属性确定是否传送cookie信息。默认情况下,只会在同域同路径下的cookie才会被传输。
      httpOnlysecure
      httpOnly和secure属性是cookie用于设置协议的种类,如果设置了httpOnly则只有在http协议下对该cookie才可见。Secure是https时可见。这两个属性主要是为了对cookie信息进行保护。
      使用java语言操作cookie
    1. //get cookie信息  
    2.         Cookie[] cookies=req.getCookies();  
    3.         if(cookies!=null)  
    4.         {  
    5.             System.out.println(  
    6.                     cookies[0].getName()+","  
    7.                     +cookies[0].getMaxAge()+","  
    8.                     +cookies[0].getDomain()+","  
    9.                     +cookies[0].getPath()+","  
    10.                     +cookies[0].getValue()+","  
    11.                     +cookies[0].getSecure()+","  
    12.                     +cookies[0].isHttpOnly());   
    13.         }  
    14.         //写入cookie   
    15.         Cookie cookie=new Cookie("mycookieID", String.valueOf(System.currentTimeMillis()));  
    16.         cookie.setHttpOnly(true);  
    17.         cookie.setMaxAge(24*60*60);//24小时后过期 -以秒为单位的,基于当前时间的有效值  
    18.         cookie.setDomain("www.max.com"); //设置域名,表示该cookie仅对www.max.com是有效  
    19.         cookie.setPath("/");//设置路径为根路径,表示该cookie对根路劲下所有path有效  
    20.         //将cookie返回给浏览器  
    21.         resp.addCookie(cookie);  
    22.          
    23.         //删除cookie  
    24.         //cookie是没有真正的删除操作的,只能通郭cookie的有效时间,设置为负值即可。过去时间的cookie  
    25.         cookie.setMaxAge(-1);  
    复制代码

      使用cookie需注意
      cookie数量过多过大,浪费网络流量,因为每次请求都会带着cookie,如果cookie过多或单个cookie携带信息较大,都会造成网络资源浪费;
      Cookie不适用于对敏感重要信息进行存储,因为浏览器中通过调试都可以看到该cookie具体信息,且每次都会在客户端缓存,所以针对一些重要密码等信息不应使用cookie进行存储.



    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 10:08 , Processed in 0.113597 second(s), 23 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表