Cookies,SSL,httpclient的多线程处理,HTTP方法

2024-05-13 13:38

本文主要是介绍Cookies,SSL,httpclient的多线程处理,HTTP方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器,它也支持手工设置cookie后发送到服务器端。不幸的是,对如何处理cookie,有几个规范互相冲突:Netscape Cookie 草案, RFC2109, RFC2965,而且还有很大数量的软件商的cookie实现不遵循任何规范. 为了处理这种状况,HttpClient提供了策略驱动的cookie管理方式。HttpClient支持的cookie规范有:
  1. Netscape cookie草案,是最早的cookie规范,基于rfc2109。尽管这个规范与rc2109有较大的差别,这样做可以与一些服务器兼容。 
  2. rfc2109,是w3c发布的第一个官方cookie规范。理论上讲,所有的服务器在处理cookie(版本1)时,都要遵循此规范,正因如此,HttpClient将其设为默认的规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在作用Netscape规范。在这种情况下,应使用兼容规范。
  3. 兼容性规范,设计用来兼容尽可能多的服务器,即使它们并没有遵循标准规范。当解析cookie出现问题时,应考虑采用兼容性规范。

   RFC2965规范暂时没有被HttpClient支持(在以后的版本为会加上),它定义了cookie版本2,并说明了版本1cookie的不足,RFC2965有意有久取代rfc2109.
  在HttpClient中,有两种方法来指定cookie规范的使用,
  1. HttpClient client = new HttpClient();
    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
    这种方法设置的规范只对当前的HttpState有效,参数可取值CookiePolicy.COMPATIBILITY,CookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109。
  2. System.setProperty("apache.commons.httpclient.cookiespec", "COMPATIBILITY");
    此法指的规范,对以后每个新建立的HttpState对象都有效,参数可取值"COMPATIBILITY","NETSCAPE_DRAFT"或"RFC2109"。
      常有不能解析cookie的问题,但更换到兼容规范大都能解决。
  
9、使用HttpClient遇到问题怎么办?

  1. 用一个浏览器访问服务器,以确认服务器应答正常
  2. 如果在使代理,关掉代理试试
  3. 另找一个服务器来试试(如果运行着不同的服务器软件更好)
  4. 检查代码是否按教程中讲的思路编写
  5. 设置log级别为debug,找出问题出现的原因
  6. 打开wiretrace,来追踪客户端与服务器的通信,以确实问题出现在什么地方
  7. 用telnet或netcat手工将信息发送到服务器,适合于猜测已经找到了原因而进行试验时
  8. 将netcat以监听方式运行,用作服务器以检查httpclient如何处理应答的。
  9. 利用最新的httpclient试试,bug可能在最新的版本中修复了
  10. 向邮件列表求帮助
  11. 向bugzilla报告bug.

  

10、SSL

  借助Java Secure Socket Extension (JSSE),HttpClient全面支持Secure Sockets Layer (SSL)或IETF Transport Layer Security (TLS)协议上的HTTP。JSSE已经jre1.4及以后的版本中,以前的版本则需要手工安装设置,具体过程参见 Sun网站 或本学习笔记。
  HttpClient中使用SSL非常简单,参考下面两个例子:
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
httpclient.executeMethod(httpget);
System.out.println(httpget.getStatusLine().toString());
,如果通过需要授权的代理,则如下:
HttpClient httpclient = new HttpClient();
httpclient.getHostConfiguration().setProxy("myproxyhost", 8080);
httpclient.getState().setProxyCredentials("my-proxy-realm", " myproxyhost",
new UsernamePasswordCredentials("my-proxy-username", "my-proxy-password"));
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
httpclient.executeMethod(httpget);
System.out.println(httpget.getStatusLine().toString());

  在HttpClient中定制SSL的步骤如下:
  1. 提供了一个实现了org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory接口的socket factory。这个 socket factory负责打一个到服务器的端口,使用标准的或第三方的SSL函数库,并进行象连接握手等初始化操作。通常情况下,这个初始化操作在端口被创建时自动进行的。
  2. 实例化一个org.apache.commons.httpclient.protocol.Protocol对象。创建这个实例时,需要一个合法的协议类型(如https),一个定制的socket factory,和一个默认的端中号(如https的443端口).
    Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);
    然后,这个实例可被设置为协议的处理器。
    HttpClient httpclient = new HttpClient();
    httpclient.getHostConfiguration().setHost("www.whatever.com", 443, myhttps);
    GetMethod httpget = new GetMethod("/");
    httpclient.executeMethod(httpget);

  3. 通过调用Protocol.registerProtocol方法,将此定制的实例,注册为某一特定协议的默认的处理器。由此,可以很方便地定制自己的协议类型(如myhttps)。
    Protocol.registerProtocol("myhttps", 
    new Protocol("https", new MySSLSocketFactory(), 9443));
    ...
    HttpClient httpclient = new HttpClient();
    GetMethod httpget = new GetMethod("myhttps://www.whatever.com/");
    httpclient.executeMethod(httpget);
    如果想用自己定制的处理器取代https默认的处理器,只需要将其注册为"https"即可。
    Protocol.registerProtocol("https", 
    new Protocol("https", new MySSLSocketFactory(), 443));
    HttpClient httpclient = new HttpClient();
    GetMethod httpget = new GetMethod("https://www.whatever.com/");
    httpclient.executeMethod(httpget);

  已知的限制和问题
  1. 持续的SSL连接在Sun的低于1.4JVM上不能工作,这是由于JVM的bug造成。
  2. 通过代理访问服务器时,非抢先认证( Non-preemptive authentication)会失败,这是由于HttpClient的设计缺陷造成的,以后的版本中会修改。

  遇到问题的处理
  很多问题,特别是在jvm低于1.4时,是由jsse的安装造成的。
  下面的代码,可作为最终的检测手段。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;

import javax.net.ssl.SSLSocketFactory;

public class Test {

public static final String TARGET_HTTPS_SERVER = "www.verisign.com"; 
public static final int TARGET_HTTPS_PORT = 443; 

public static void main(String[] args) throws Exception {

Socket socket = SSLSocketFactory.getDefault().
createSocket(TARGET_HTTPS_SERVER, TARGET_HTTPS_PORT);
try {
Writer out = new OutputStreamWriter(
socket.getOutputStream(), "ISO-8859-1");
out.write("GET / HTTP/1.1/r/n"); 
out.write("Host: " + TARGET_HTTPS_SERVER + ":" + 
TARGET_HTTPS_PORT + "/r/n"); 
out.write("Agent: SSL-TEST/r/n"); 
out.write("/r/n"); 
out.flush(); 
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} finally {
socket.close(); 
}
}
}


  
11、httpclient的多线程处理

  使用多线程的主要目的,是为了实现并行的下载。在httpclient运行的过程中,每个http协议的方法,使用一个HttpConnection实例。由于连接是一种有限的资源,每个连接在某一时刻只能供一个线程和方法使用,所以需要确保在需要时正确地分配连接。HttpClient采用了一种类似jdbc连接池的方法来管理连接,这个管理工作由 MultiThreadedHttpConnectionManager完成。
MultiThreadedHttpConnectionManager connectionManager = 
new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
此是,client可以在多个线程中被用来执行多个方法。每次调用HttpClient.executeMethod() 方法,都会去链接管理器申请一个连接实例,申请成功这个链接实例被签出(checkout),随之在链接使用完后必须归还管理器。管理器支持两个设置:
maxConnectionsPerHost每个主机的最大并行链接数,默认为2
maxTotalConnections客户端总并行链接最大数,默认为20

  管理器重新利用链接时,采取早归还者先重用的方式(least recently used approach)。
  由于是使用HttpClient的程序而不是HttpClient本身来读取应答包的主体,所以HttpClient无法决定什么时间连接不再使用了,这也就要求在读完应答包的主体后必须手工显式地调用releaseConnection()来释放申请的链接。
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
...
// 在某个线程中。
GetMethod get = new GetMethod("http://jakarta.apache.org/");
try {
client.executeMethod(get);
// print response to stdout
System.out.println(get.getResponseBodyAsStream());
} finally {
// be sure the connection is released back to the connection 
// manager
get.releaseConnection();
}
对每一个HttpClient.executeMethod须有一个method.releaseConnection()与之匹配.

12、HTTP方法

  HttpClient支持的HTTP方法有8种,下面分述之。

  1、Options

  HTTP方法Options用来向服务器发送请求,希望获得针对由请求URL(request url)标志的资源在请求/应答的通信过程可以使用的功能选项。通过这个方法,客户端可以在采取具体行动之前,就可对某一资源决定采取什么动作和/或以及一些必要条件,或者了解服务器提供的功能。这个方法最典型的应用,就是用来获取服务器支持哪些HTTP方法。
  HttpClient中有一个类叫OptionsMethod,来支持这个HTTP方法,利用这个类的getAllowedMethods方法,就可以很简单地实现上述的典型应用。

OptionsMethod options = new OptionsMethod("http://jakarta.apache.org");
// 执行方法并做相应的异常处理
...
Enumeration allowedMethods = options.getAllowedMethods();
options.releaseConnection();

  2、Get

   HTTP方法GET用来取回请求URI(request-URI)标志的任何信息(以实体(entity)的形式),"get"这个单词本意就是”获取“的意思。如果请求URI指向的一个数据处理过程,那这个过程生成的数据,在应答中以实体的形式被返回,而不是将这个过程的代码的返回。
  如果HTTP包中含有If-ModifiedSince, If-Unmodified-Since, If-Match, If-None-Match, 或 If-Range等头字段,则GET也就变成了”条件GET“,即只有满足上述字段描述的条件的实体才被取回,这样可以减少一些非必需的网络传输,或者减少为获取某一资源的多次请求(如第一次检查,第二次下载)。(一般的浏览器,都有一个临时目录,用来缓存一些网页信息,当再次浏览某个页面的时候,只下载那些修改过的内容,以加快浏览速度,就是这个道理。至于检查,则常用比GET更好的方法HEAD来实现。)如果HTTP包中含有Range头字段,那么请求URI指定的实体中,只有决定范围条件的那部分才被取回来。(用过多线程下载工具的朋友,可能比较容易理解这一点)
  这个方法的典型应用,用来从web服务器下载文档。HttpClient定义了一个类叫GetMethod来支持这个方法,用GetMethod类中getResponseBody, getResponseBodyAsStream 或 getResponseBodyAsString函数就可以取到应答包包体中的文档(如HTML页面)信息。这这三个函数中,getResponseBodyAsStream通常是最好的方法,主要是因为它可以避免在处理下载的文档之前缓存所有的下载的数据。
GetMethod get = new GetMethod("http://jakarta.apache.org");
// 执行方法,并处理失败的请求.
...
InputStream in = get.getResponseBodyAsStream();
// 利用输入流来处理信息。
get.releaseConnection();

  对GetMethod的最常见的不正确的使用,是没有将全部的应答主体的数据读出来。还有,必须注意要手工明确地将链接释放。

  3、Head

  HTTP的Head方法,与Get方法完全一致,唯一的差别是服务器不能在应答包中包含主体(message-body),而且一定不能包含主体。使用这个方法,可以使得客户无需将资源下载回就可就以得到一些关于它的基本信息。这个方法常用来检查超链的可访问性以及资源最近有没有被修改。
  HTTP的head方法最典型的应用,是获取资源的基本信息。HttpClient定义了HeadMethod类支持这个方法,HeadMethod类与其它*Method类一样,用 getResponseHeaders()取回头部信息,而没有自己的特殊方法。
HeadMethod head = new HeadMethod("http://jakarta.apache.org");
// 执行方法,并处理失败的请求.
...
// 取回应答包的头字段信息.
Header[] headers = head.getResponseHeaders();

// 只取回最后修改日期字段的信息.
String lastModified = head.getResponseHeader("last-modified").getValue();



  4、Post

  Post在英文有“派驻”的意思,HTTP方法POST就是要求服务器接受请求包中的实体,并将其作为请求URI的下属资源。从本质上说,这意味着服务器要保存这个实体信息,而且通常由服务器端的程序进行处理。Post方法的设计意图,是要以一种统一的方式实现下列功能:
  1. 对已有的资源做评注
  2. 将信息发布到BBS、新闻组、邮件列表,或类似的文章组中
  3. 将一块数据,提交给数据处理进程
  4. 通过追加操作,来扩展一个数据库
  这些都操作期待着在服务器端产生一定的“副作用”,如修改了数据库等。
  HttpClient定义PostMethod类以支持该HTTP方法,在httpclient中,使用post方法有两个基本的步骤:为请求包准备数据,然后读取服务器来的应答包的信息。通过调用 setRequestBody()函数,来为请求包提供数据,它可以接收三类参数:输入流、名值对数组或字符串。至于读取应答包需要调用 getResponseBody* 那一系列的方法,与GET方法处理应答包的方法相同。
  常见问题是,没有将全部应答读取(无论它对程序是否有用),或没有释放链接资源。

这篇关于Cookies,SSL,httpclient的多线程处理,HTTP方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985857

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo