有点混淆这里实际可能的东西.
Java Apache HTTP Client(4.x)链代理可以吗?关于如何提示?
我发现文档表明它可以,但源代码有点复杂,我发现至少有一个类(DefaultRequestDirector)抛出异常;
throw new HttpException("Proxy chains are not supported.")
Run Code Online (Sandbox Code Playgroud)
使用单个代理配置客户端是直接的
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
Run Code Online (Sandbox Code Playgroud)
但对我来说,如何设置代理链并不明显.如果我按照上面文档中的提示操作,请执行以下操作.
httpClient.setRoutePlanner(new HttpRoutePlanner() {
@Override
public HttpRoute determineRoute(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
return new HttpRoute(target, null, new HttpHost[]{proxy, new HttpHost("localhost", 8081)}, "https".equalsIgnoreCase(target.getSchemeName()), TunnelType.TUNNELLED, LayerType.PLAIN);
}
});
Run Code Online (Sandbox Code Playgroud)
但这会导致上述异常;
org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
at Main.main(Main.java:70)
Caused by: org.apache.http.HttpException: Proxy chains are not supported.
at org.apache.http.impl.client.DefaultRequestDirector.createTunnelToProxy(DefaultRequestDirector.java:957)
at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:764)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:579)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
... 8 …Run Code Online (Sandbox Code Playgroud) 我需要与一个需要身份验证的模糊网络服务器交谈.如果我不提供凭据,则会显示登录表单.但是,如果我提供未经请求的基本身份验证凭据,我会直接获得所需的内容.
wget 直接支持这个:
# this fails and downloads a form:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh
# this works and downloads the document:
wget https://weird.egg/data.txt --http-user=me --http-password=shhh --auth-no-challenge
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何使用Apache的HTTP组件在Java中进行下载?
这是我到目前为止所得到的.(还有到位的代理,我用-Y on的wget,我有一个匹配的https_proxy环境变量.)
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import java.net.URI;
// ...
DefaultHttpClient hc = new DefaultHttpClient();
hc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxy_name, proxy_port));
URI uri = new URI("https://weird.egg/data.txt");
hc..getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials("me", "shh"));
hc.execute(new HttpGet(uri)); // etc
Run Code Online (Sandbox Code Playgroud)
但是,我最终只得到登录表单页面,而不是实际文档.我怀疑DefaultHttpClient没有像这样发送未经请求的凭证wget.有没有办法让Java程序发送凭据?
我正在使用Apache HttpComponents 4.2.1,并且无法使HttpGet.abort()和HttpPost.abort()总是立即中止。它在大多数时间都有效,但是有时连接会阻塞直到超时。我注意到只有在我明确设置超时值时才会发生这种情况。
这是我的测试代码:
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
testAbort();
}
}
public static void testAbort() throws Exception {
String urlString = "http://slow.website.com";
final HttpGet httpGet = new HttpGet(urlString);
Runnable runnable = new Runnable() {
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000); // issue doesn't occur if I comment this line
httpClient.execute(httpGet);
}
catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 根据http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java上的示例
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Run Code Online (Sandbox Code Playgroud)
应该使用我的自定义信任库来实例化SSLSocketFactory,但是当我尝试构建我的项目时,我得到了错误
javax.net.ssl.SSLSocketFactory is abstract; cannot be intantiated
Run Code Online (Sandbox Code Playgroud)
这个例子过时了吗?它适用于其他人吗?
我正在尝试从网络服务器获取一些数据,这些数据与 http 配合良好。
但是当我尝试 https(ssl connection) 时,我得到如下异常。
我得到了正确的 http 状态代码 200 和响应内容长度 2230。
java.net.SocketException: Socket is closed
at sun.security.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1483)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:92)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:183)
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:144)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:121)
Run Code Online (Sandbox Code Playgroud)
我的代码如下,带有 apache httpcomponents httpclient(4.2.5) 库。
try {
HttpPost httppost = new HttpPost(uri);
HttpHost targetHost = new HttpHost(HOST_NAME, HOST_PORT, PROTOCOL);
InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(request), -1);
String contentType = TSPConstants.CONST_TSA_CONTENT_TYPE_TSREQUEST;
reqEntity.setContentType(contentType);
reqEntity.setChunked(true);
// It may be more appropriate to use FileEntity class in this particular
// instance but we …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache HttpComponents v4.3.3(maven httpclient和httpmime).我需要上传一个包含一些元数据的文件.curl命令可以工作,如下所示.
curl -k -i -H"Content-Type:multipart/mixed"-X POST --form'field1 = val1'-form'field2 = val2'-form'file =@somefile.zip; type = application /拉链" 的https://www.some.domain/
我试过模仿这个卷曲的帖子,如下所示.
HttpEntity entity = MultiPartEntityBuilder
.create()
.addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN))
.addPart("field2",new StringBody("val2",ContentType.TEXT_PLAIN))
.addPart("file", new FileBody(new File("somefile.zip"), ContentType.create("application/zip"))
.build();
HttpPost post = new HttpPost("https://www.some.domain");
post.addHeader("Content-Type", "multipart/mixed");
Run Code Online (Sandbox Code Playgroud)
但是,在我使用HttpClient执行HttpPost之后,我得到以下异常(服务器代码也是在Jetty上运行的Java).
org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界
当我添加一个曲线卷曲
curl --trace - -k -i -H"Content-Type:multipart/mixed"-X POST --form'field1 = val1'-form'field2 = val2'-form'file =@somefile.zip; type = application/zip'https://www.some.domain/
我看到表单字段/值对被设置为HTTP标头.
内容处理:表格数据; 名称=字段1 ...值1
我在这里做错了什么?任何帮助表示赞赏.
我正在尝试将 HTTP/1.0 与 Apache HttpClient 4.3 一起使用,但我不知道如何使用。在 3.x 版本中,它是这样完成的:
httpClient.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_0);
Run Code Online (Sandbox Code Playgroud)
现在已经弃用了。现在怎么办?谢谢你。
使用Apache HTTP组件作为客户端与在Tomcat服务器上运行的Web应用程序通信时,我在cookie管理方面遇到了一些问题。长话短说,我发现这是由于使用版本0的Set-Cookie标头导致的,默认情况下,这会导致HTTP组件使用不同的逻辑流并忽略没有域后缀的主机地址。尽管我可以通过更改cookie策略轻松解决此问题,但总体上我对cookie版本感到好奇。我似乎找不到太多有关这些天Web服务器默认应使用哪个版本的信息。出于兼容性考虑,Tomcat似乎默认为版本0。我不应该将其配置为使用版本1或2,还是有理由退出该版本?我不确定是否有任何安全性/兼容性/功能方面的隐患,还是根本就没有太大关系。我想它正在使用版本0与旧的浏览器兼容,我们还是不支持旧的浏览器。
我有一个 Java 应用程序正在尝试通过 http 代理访问 Web 服务。Java 应用程序是第三方应用程序,我们无法访问其源代码。
可以通过传递 Java 启动参数等来配置其启动。我想知道可以传递哪些 java 属性,以便应用程序可以使用登录用户的 NTLM 凭据来验证代理连接?
当我将 https.proxyHost 和 https.proxyPort (即 -Dhttps.proxyHost=abcd ... 传递给 jvm 命令行)时,我确实看到日志中存在差异。现在失败并显示以下消息。
[WrapperSimpleAppMain] [AuthChallengeProcessor] ntlm authentication scheme selected
INFO | jvm 5 | 2015/06/03 14:49:25 | 2015-06-03 14:49:25,380
INFO [WrapperSimpleAppMain] [HttpMethodDirector] No credentials available for NTLM <any realm>@proxy.ins.dell.com:80
INFO | jvm 5 | 2015/06/03 14:49:25 | Exiting due to fatal exception.
INFO | jvm 5 | 2015/06/03 14:49:25 | com.atlassian.bamboo.agent.bootstrap.RemoteAgentHttpException: HTTP status code 407 received in response …Run Code Online (Sandbox Code Playgroud) java bamboo http-proxy apache-httpcomponents apache-httpclient-4.x
如上所述,SSLKEYLOGFILE 可以与某些程序一起使用来捕获按键日志。
但使用 TLS 的 Java 程序不尊重此环境变量。让这样的Java程序转储按键日志的正确方法是什么?(我认为Java程序很可能使用以下包进行TLS。但我不完全确定。)