zoukankan      html  css  js  c++  java
  • 4、HTTP(下)

       】 

    HTTP方法

    与HTTP服务器的通信遵循一种请求--响应模式

    先是接收一个无状态的请求,后面是一个无状态的响应

    每个HTTP请求包含两个或三个部分:

    1、起始行,包含HTTP方法和要执行这个方法的资源路径

    2、一个包含  名-值 字段的首部,可以提供元信息,如认证凭据和请求中首选使用的合适

    3、一个 请求主体,包含资源的一个表示(只针对POST和PUT)

    主要有4个HTTP方法来标识可以完成的操作:

    1、GET:获取一个资源的表示,如果失败完全可以重复执行GET,不用担心有任何问题

          GET输出通常会缓存,可以通过正确的首部来控制

    2、POST:最通用的方法,将资源的一个表示上传到已知的URL的服务器,但是没有指定服务器如何处理这个新提供的资源 

    3、PUT:将资源的一个表示上传到已知URL的服务器,没有副作用,有等幂性

          重复这个方法不用担心它是否失败

          如果连续两次将同一个文档放在同一个服务器的统一位置,与只放一次,服务器的状态是一样的

    4、DELETE:从一个指定URL删除一个资源,没有副作用,也是幂等的

            不确定删除请求是否成功,完全可以再次发送这个请求

    不完成提交所有安全操作 应当使用GRT,只有真正提交的操作才使用POST

    请求主体

    GET方法获取URL所标识的资源的一个表示

    用GET从服务器获取的资源的具体位置由路径和查询字符串的不同部分指定

    不同的路径和查询字符串如何简单映射到不同资源要由服务器来决定

    URL类并不关心这些,只要知道URL就能知道从哪里下载

    POST和PUT:客户端除了要提供路径和查询字符串还需要提供资源的表示

    资源表示在请求主题中发送,放在首部后面

    会按顺序发送:

    1、一个起始行,包括方法、路径和查询字符串,以及HTTP版本

    2、一个HTTP首部

    3、一个空行

    4、主体

    POST请求向服务器发送表单的数据

    主题包含一个Content-Type:application/x-www-form-urlencoded数据

    但不只有这一种可能性

    一般来说,主体可以包含任意的字节

    但是HTTP首部需要包括两个字段来指定主体的性值:

    1、Content-length:指定主体中有多少字节

    2、Content-type:指定类型为MIME媒体类型

    Cookie

    网站可以使用一些小文本串在连接存储持久的客户端状态,这些小文本称为cookie

     cookie在请求和响应的HTTP首部

    从服务器传递到客户端

    在从客户端传回服务器

    服务器使用cookie来指示会话ID、购物车内容、登陆凭据等

    cookie值可能是一个无意义的字符串

    标识某种数据中的一个特定的记录

    实际信息存储在那个数据库中

    cookie通常并不包含数据,只是指示服务器上的数据

    cookie只能是非空白符的ASCII文本,不能包括逗号或者分号

    要在浏览器中设置一个cookie

    服务器会在HTTP首部中包含一个Set-Cookie首部行

    浏览器再次向服务器做出第二个请求

    他会在HTTP请求首部行中的Cookie行发回这个cookie

     只要服务器不重用cookie

    这会使他在多个无状态的HTTP连接上跟踪各个用户和会话

    服务器可以设置多个Cookie

    除了简单的name-value对

    cookie可以有更多属性来哦内阁制他们的作用域

    包括日期、路径、域、端口、版本和安全选项

    默认情况下

    cookie来自那个服务器就应用于那个服务器

    网站也可以指示一个cookie应用于整个子域

    而不是整个服务器

     

    一些网站把一个域的一个图像或其他内容嵌入到另一个域的一个页面,从而绕过 这个限制

    所嵌入内容设置的cookie称为第三方cookie

    很多用户会阻塞所有第三方cookie

    处于保密的原因

    一些Web浏览器也开始默认阻塞这些第三方cookie

    Cookie的作用于还受路径限制

    所以会返回到服务器上的某些目录,而不是全部

    默认作用域是最初的URL和所有子目录

    http://www.mrchengs.com/index设置一个cookie

    那么这个cookie可以用到http://www.mrchengs.com/index/xxx

    但是不能作用于http://www.mrchengs.com/xxxx(除了index)

    cookie中的path属性可以改默认作用域

    此时的user=elharo的cookie只应用于/restricted

    请求相同服务器上子树/restricted中的一个文档时

    客户端会回显这个cookie

    不会在网站的其他目录中使用这个cookie

    cookie可以同时包括域和路径

    作用于example.com域中任何服务器的/restricted路径

    不同的cookie属性的顺序无关紧要

    只要全部是使用分号隔开

    cookie自己的名和值放在最前即可

    客户端把cookie发回i服务器时,路径必须在最前面

    Max-Age属性:可以设置cookie经过一定秒数之后过期

    而不是在特定的时刻过期

    Cookie可能包含敏感信息(口令密钥...)

    一些cookie事务应当是安全的

    大多数情况下,会使用HTTPS代替HTTP,不论标识什么

    每个cookie都有一个没有值的属性secure

     

    浏览器应当拒绝非安全通道发送这种cookie

    特别强调不能由JS返回

    CookieManager

    Java 5包括一个抽象类java.net.CookieHandler

    定义了存储和获取cookie的一个API

    但不包括抽象类的实现,所以有很多工作要做

    Java 6进一步做了补充,为CookieHandler增加了一个可以使用具体子类的java.net.CookieManager

    默认情况下cookie并不打开

    在java存储和返回cookie之前,需要首先启动cookie

    这两行代码安装了一个CookManager之后,对于URL类连接的HTTP服务器

    Java会存储这些服务器发送的所有cookie

    在后续的请求中向这些服务器发回存储的cookie

    对于接收哪里发送的cookie还需要慎重

    可以通过指定CookiePolicy来指定

    预定了3个策略:

    下方的代码会阻塞第三方cookie

    但是会接收第一方cookie

    即:只接受与服务器的发送的Cookie

    不能接收Internet上其他服务器发送的cookie

     

     还希望接收更有粒度的控制

    接收某些已知域的cookie,不接受其他域的cookie

    可以自行实现CookiePolicy节后,并且覆盖shouldAccept()方法

    public interface CookiePolicy {
    
        public static final CookiePolicy ACCEPT_ALL = new CookiePolicy(){
            public boolean shouldAccept(URI uri, HttpCookie cookie) {
                return true;
            }
        };
    
        public static final CookiePolicy ACCEPT_NONE = new CookiePolicy(){
            public boolean shouldAccept(URI uri, HttpCookie cookie) {
                return false;
            }
        };
    
        public static final CookiePolicy ACCEPT_ORIGINAL_SERVER  = new CookiePolicy(){
            public boolean shouldAccept(URI uri, HttpCookie cookie) {
                if (uri == null || cookie == null)
                    return false;
                return HttpCookie.domainMatches(cookie.getDomain(), uri.getHost());
            }
        };
    
        public boolean shouldAccept(URI uri, HttpCookie cookie);
    }

     实例:

    阻塞所有.xxx cookie但接收其他cookie策略

    CookieStore

    有时需要在本地存放和获取cookie

    一个应用退出时可以把cookie存在本地磁盘上

    下一次启动时在加载这些

    可以使用getCookieStore()方法来获取这个cookie库

    CookieManager就在这里保存它的cookie

     CookieStore类可以增加、删除、列出cookie

    能控制正常HTTP请求响应流之外发送的cookie

    库中的每个cookie都封装在一个HttpCookie对象中

    塔公一些方法来检查cookie的属性

     

  • 相关阅读:
    如何学习新技术
    创建模式之工厂方法模式
    SQL Server 存储过程
    ASP.NET Cache的一些总结
    ACE_TSS研究
    利用Thunk让C++成员函数变回调函数
    ACE内存映射学习
    ACE的初始化
    双检锁模式学习
    ACE_Task笔记
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10924457.html
Copyright © 2011-2022 走看看