HttpClient4.5教程-第三章-HTTP状态管理

简介:         最初的HTTP呗设计成为无状态的,面向request/response的协议,并没有为跨越多个逻辑依赖的request/response交换的有状态的session做准备,随着HTTP协议被越来越广泛的使用,许多系统已经使用它来为超出预期的应用服务,如电子商务应用的传输,于是,状态管理逐渐变得有必要。

        最初的HTTP呗设计成为无状态的,面向request/response的协议,并没有为跨越多个逻辑依赖的request/response交换的有状态的session做准备,随着HTTP协议被越来越广泛的使用,许多系统已经使用它来为超出预期的应用服务,如电子商务应用的传输,于是,状态管理逐渐变得有必要。

Netscape公司是当时web客户端和服务端软件开发的领导者,基于私有规范在其产品中实现了HTTP状态管理,随后,Netscape尝试通过发布规范草案来标准化该机制,这些努力有助于通过RFC形成规范文档,然而在大多数的应用里,状态管理依旧是很大程度上基于Netscape的草案并且跟官方规范不兼容,web开发者都可以感觉到强行保留与这些应用的兼容性导致了标准规范碎片化。


3.1 HTTP cookies

        HTTP cookie是HTTP客户端和服务端之间交互的一小段状态信息或者标记用于维持一个会话信息,Netscape工程师用一个魔法饼干来形容它,而这一名称就被保留了下来。

        HttpClient使用Cookie接口来表示抽象的cookie标记,HTTP cookie最简单的形式就是一个键值对,通常HTTP cookie包含一系列属性比如合法域名,cookie可以被接收的URL的子集,cookie保存的最大时间。

        SetCookie接口代表Set-Cookie response头消息,该消息从服务端发送给客户端用于保持一个会话状态。

        ClientCookie接口继承自Cookie接口,其可以实现额外的客户端特定的功能,比如精确的检索源服务器指定的源cookie属性,这对于生成Cookie头信息非常重要,因为一些cookie规范要求特定的属性仅当他们在Set-Cookie头消息指定时才能被Cookie头包含进去。

 下面是一个创建客户端Cookie对象的例子:

BasicClientCookie cookie = new BasicClientCookie("name", "value");
// Set effective domain and path attributes
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
// Set attributes exactly as sent by the server
cookie.setAttribute(ClientCookie.PATH_ATTR, "/");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");

3.2 Cookie规范

        CookieSpec接口代表了cookie管理的规范,cookie管理规范包含如下内容:

        解析Set-Cookie头部的规则

        验证已解析cookie的规则

        为已给定主机,端口和源路径格式化Cookie头部

        HttpClient附带多种CookieSpec实现:

        Standard strict(严格):状态管理策略行为完全符合RFC6265第四章的行为定义。

        Standard(标准):状态管理策略较为符合RFC6265第四章定义的行为,以期望在不是完全遵守该行为之间的服务器之间进行交互。

        Netscape 草案(已过时):该策略遵守Netscape公司公布最初的规范草案,除非确实需要与旧代码兼容,否则尽量避免使用它。

        RFC 2965(已过时): 状态管理策略符合过时的RFC2965定义的状态管理规范。请不要在新应用中使用。

        RFC2109(已过时):状态管理策略符合过时的RFC2109定义的状态管理规范,请不要在新应用中使用。

        浏览器兼容性Browser compatibility(已过时):该策略尝试尽量去模拟老旧的浏览器版本如微软IE和Mozilla FireFox,请不要在新应用中使用。

        Default:默认cookie策略是一种综合性的策略,其基于HTTP response返回的cookie属性如version信息,过期信息,与RFC2965,RFC2109或者Netscape草案兼容,该策略将会在下一个HttpClient小版本(基于RFC6265)中废弃。

        Ignore cookies:所有的cookie都被忽略

强烈建议在新应用中使用Standard或者Standard strict策略,过时规范应该仅仅是在与旧系统兼容时使用。下一个HttpClient版本将会停止对过时规范的支持。


3.3 选择Cookie策略

Cookie策略能够通过HTTP客户端设置,并且可以在HTTP request时被覆盖掉。

RequestConfig globalConfig = RequestConfig.custom()
        .setCookieSpec(CookieSpecs.DEFAULT)
        .build();
CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultRequestConfig(globalConfig)
        .build();
RequestConfig localConfig = RequestConfig.copy(globalConfig)
        .setCookieSpec(CookieSpecs.STANDARD_STRICT)
        .build();
HttpGet httpGet = new HttpGet("/");
httpGet.setConfig(localConfig);


3.4 定制cookie策略

        为了实现定制cookie策略,你应该创建一个自定义的CookieSpec接口的实现,创建一个CookieSpecProvider的实现类,然后用该实现类去创建和初始化自定义规范的实例,然后使用HttpClient进行注册,一旦自定义规范被注册,它就会如同标准cookie规范一样被触发。

PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.getDefault();

Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
        .register(CookieSpecs.DEFAULT,
                new DefaultCookieSpecProvider(publicSuffixMatcher))
        .register(CookieSpecs.STANDARD,
                new RFC6265CookieSpecProvider(publicSuffixMatcher))
        .register("easy", new EasySpecProvider())
        .build();

RequestConfig requestConfig = RequestConfig.custom()
        .setCookieSpec("easy")
        .build();

CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultCookieSpecRegistry(r)
        .setDefaultRequestConfig(requestConfig)
        .build();


3.5 Cookie持久化

        HttpClient可以同任何实现了CookieStore接口的实际Cookie存储器协同工作,模拟的CookieStore实现叫做BasicCookieStore,是一个基于java.util.ArrayList的简单实现,当容器进行垃圾回收时,如果BasicClientCookie对象被回收掉了,其存储的Cookie也会丢失,你可以提供更复杂的实现来满足自己的需求。

// Create a local instance of cookie store
CookieStore cookieStore = new BasicCookieStore();
// Populate cookies if needed
BasicClientCookie cookie = new BasicClientCookie("name", "value");
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);
// Set the store
CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultCookieStore(cookieStore)
        .build();


3.6 HTTP状态管理和运行上下文

        在HTTP request执行过程中,HttpClient将如下的状态管理相关的对象添加到运行上下文中。

        Lookup 实例代表实际的cookie注册规范,该属性的值的优先级为当前上下文大于默认上下文。

        CookieSpec实例代表着实际的cookie规范。

        CookieOrigin实例代表着源服务器的详细Cookie信息。

        CookieStore实例代表着实际的Cookie存储,该属性的值的优先级为当前上下文大于默认上下文。

        当前HttpContext对象能够在请求执行之前用来定制HTTP状态管理上下文,或者在请求执行之后检查其状态,你也可以通过单独的运行上下文来实现各自的状态管理,在HTTP客户端级别,当前上下文的ookie注册规范和cookie存储优先级大于默认的上下文。

CloseableHttpClient httpclient = <...>

Lookup<CookieSpecProvider> cookieSpecReg = <...>
CookieStore cookieStore = <...>

HttpClientContext context = HttpClientContext.create();
context.setCookieSpecRegistry(cookieSpecReg);
context.setCookieStore(cookieStore);
HttpGet httpget = new HttpGet("http://somehost/");
CloseableHttpResponse response1 = httpclient.execute(httpget, context);
<...>
// Cookie origin details
CookieOrigin cookieOrigin = context.getCookieOrigin();
// Cookie spec used
CookieSpec cookieSpec = context.getCookieSpec();


目录
相关文章
|
6月前
|
缓存 网络协议 安全
49. 【Android教程】HTTP 使用详解
49. 【Android教程】HTTP 使用详解
94 1
|
13天前
|
关系型数据库 MySQL Java
Servlet+MySQL增删改查 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/1391
对于任何项目开发,创建,读取,更新和删除(CRUD)记录操作是应用程序的一个最重要部分。
52 20
|
9天前
|
安全 数据安全/隐私保护
IP地址https证书免费申请教程
本教程详细介绍如何免费申请IP地址HTTPS证书,涵盖准备、申请、审核、下载与部署阶段。从确认IP地址、选择CA、注册账户到验证控制权,最后完成证书部署,确保数据传输安全。注意证书有效期较短,需及时续签。
|
1月前
|
安全 网络安全 数据安全/隐私保护
政务内网实现https访问教程
政务内网实现HTTPS访问需经过多个步骤:了解HTTPS原理,选择并申请适合的SSL证书,配置SSL证书至服务器,设置端口映射与访问控制,测试验证HTTPS访问功能,注意证书安全性和兼容性,定期备份与恢复。这些措施确保了数据传输的安全性,提升了政务服务的效率与安全性。
|
1月前
|
安全 网络安全 数据安全/隐私保护
内网IP地址实现HTTPS加密访问教程
在内网环境中,为确保数据传输的安全性,绑定SSL证书搭建HTTPS服务器至关重要。本文介绍了内网IP地址的前期准备、申请SSL证书的步骤以及客户端配置方法。具体包括选择合适的CA、注册账号、提交申请、下载证书,并在客户端导入根证书,确保通信数据的安全加密。推荐使用JoySSL提供的技术解决方案,确保内网设备通信安全。
内网IP地址实现HTTPS加密访问教程
|
2月前
|
Java 网络架构 Kotlin
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
本文是一个入门级教程,介绍了如何使用Kotlin和Spring Boot搭建HTTP服务,并强调了Kotlin的空安全性特性。
74 7
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
|
4月前
|
SQL 存储 小程序
【教程】navicat配合HTTP通道远程连接SQLite数据库
本文介绍了如何通过 Navicat Premium 工具配合 n_tunnel_sqlite.php 和 HTTP 通道远程连接服务器上的 SQLite 数据库。SQLite 是一种自给自足的、无服务器的 SQL 数据库引擎,由于其端口未对外开放,直接使用 Navicat 进行远程连接不可行。文章详细记录了使用 HTTP 通道实现远程连接的过程,包括定位本地 `ntunnel_sqlite.php` 文件,将其上传至服务器,并通过 Navicat 配置 HTTP 通道连接 SQLite 数据库的具体步骤。
199 0
【教程】navicat配合HTTP通道远程连接SQLite数据库
|
5月前
|
JSON 网络协议 安全
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识
【7月更文挑战第16天】本文介绍了HTTP和HTTPS协议的基本概念与作用,强调了理解HTTP协议对使用抓包工具Fiddler的重要性。HTTP是用于Web浏览器与服务器间信息传输的协议,不加密,易被截取,不适合传输敏感信息。HTTPS是HTTP的安全版,通过SSL/TLS提供加密和服务器身份验证,确保数据安全。HTTP请求包括请求行、请求头、空行和可选的请求主体,响应则有响应行、响应头、空行和响应主体。HTTP协议无状态,而HTTPS解决了安全性问题,但也带来了额外的计算开销。Fiddler作为一个强大的抓包工具,可以帮助开发者和测试人员分析HTTP/HTTPS通信,理解请求和响应的结构。
85 4
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识
|
5月前
|
Web App开发 XML 缓存
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
【7月更文挑战第19天】Fiddler会话面板概览:Fiddler的会话列表显示HTTP请求的详细信息,包括ID、状态码、协议、主机名、URL、内容类型、大小、进程及自定义备注。颜色和图标标识状态,如红色表示错误,黄色为认证,蓝色是HTML响应。用户可右键列进行搜索、标记重复、隐藏或自定义列,如添加请求方法。通过界面或脚本可添加自定义列,如显示ServerIP。会话还可复制和保存,解决乱码问题需解码响应体。
76 0
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
|
5月前
|
网络协议 程序员 应用服务中间件
Swoole与Go系列教程之HTTP服务的应用
PHP 曾是Web开发领域佼佼者,随着业务壮大,异步和高并发方面不足显现。Swoole 曾经尝试填补空白,但局限性也比较的明显。Go 语言的崛起,简洁语法和并发优势吸引大厂使用,吸引了大多数程序员的转型。
1005 0
Swoole与Go系列教程之HTTP服务的应用