连接到URL使用Apache的HttpClient的VS使用JDK的URLConnection的一个

2019-07-31 05:59发布

在下面的代码,我已验证连接到一个URL从applet中保留了浏览器会话,如果使用JDK的URLConnection类。 然而,这是不是这样,如果使用Apache的HttpClient库。 有谁知道为什么吗? 另外,有我的方式来设置连接实例由HttpClient的实例中使用?

import java.applet.Applet;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;

import javax.net.ssl.SSLException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpClientTesterApplet extends Applet {
    private static final long serialVersionUID = -1599714556710568947L;

    public void testHttpClient() throws ClientProtocolException, IOException,
            URISyntaxException {
        URL url = new URL(String.format("%s://localhost:%s/%s/testHttpClient",
                getParameter("protocol"), getParameter("port"),
                getParameter("context")));

        HttpClient client = new DefaultHttpClient();

        HttpPost post = new HttpPost(url.toURI());

        System.out.println("Executing request " + post.getURI());

        try {
            System.out
                    .println(client.execute(post, new BasicResponseHandler()));
        } catch (SSLException e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Executed request " + post.getURI());

        System.out.println("Opening connection " + url);

        HttpURLConnection urlConnection = (HttpURLConnection) url
                .openConnection();

        System.out.println("Opened connection " + url);

        urlConnection.setRequestMethod("POST");

        System.out.println("Connecting");

        urlConnection.connect();

        System.out.println("Connected");

        InputStream inputStream = urlConnection.getInputStream();

        try {
            while (inputStream.read() != -1) {
                System.out.println("Reading");
            }
        } finally {
            inputStream.close();
        }
    }
}

Answer 1:

这是库实现通过插座自己的URL连接的通病。 显然,JRE实现URLConnection类的可以到浏览器的信息直接。 我们不得不使用的技术,通过oscargm上面提到的,即在应用程序服务器写入请求中的Cookie是参数的小程序并使用JavaScript让浏览器的文件饼干(这是SSO的情况下,设置好饼干的可能不会因为中间剂的相同 - 代理服务器)。 请注意,如果饼干的HttpOnly - 的JavaScript代码将失败。



Answer 2:

你必须将jsessionid的cookie或重写您的网址使用jsessionid

这是服务器知道您的会话的方式。

如果您生成的applet在JSP页面中的标签动态,你可以在传递jsessionid值的小程序作为参数,然后使用它。

post.setHeader("Cookie", "jsessionid=" + jsessionidValue );


Answer 3:

我认为你正在使用的HttpClient的旧版本。 检查出的HttpClient的网站 。

在当前的API,可以在执行方法使用的HttpState,让你的代码看起来是这样的:

HttpClient client = new HttpClient();
HttpMethod method = new PostMethod(url.toURI());
HttpState state = new HttpState();

client.executeMethod(HttpConfiguration.ANY_HOST_CONFIGURATION, method, state);

在接下来的执行,传递相同的“状态”的对象,你会得到保留凭据和饼干。



Answer 4:

可能的原因是,你有没有做过一个断开()使用URLConnection的时候,然而,阿帕奇库将关闭连接,当你用它做。



Answer 5:

氏是一个重要的问题。

标准java.net.URLConnection中类与Java插件和网络浏览器,可以继承会话,HTTP认证令牌,代理连接器等无缝集成

在Apache的百科全书家伙犯了严重的错误,当他们决定从套接字实现HttpClient的(即从头开始),而不是只对标准的java.net.URL *类的顶部发展。 HttpClient的不从java.net.URLConnection中继承,因此它不能继承其先进的企业功能。

也许开放源代码项目并不像他们想象的那么聪明。



Answer 6:

我可以使它不经过饼干作为参数,从网页使用此代码的工作:

private String retrieveCookies(URL url) throws IOException, URISyntaxException 
{ 
     String cookieValue = null;

     CookieHandler handler = CookieHandler.getDefault();
     if (handler != null)    {
          Map<String, List<String>> headers = handler.get(url.toURI(), new HashMap<String, List<String>>());

          List<String> cookiesList = headers.get("Cookie");
          if (cookiesList != null)
          {
              for (String v : cookiesList) {
                  if (cookieValue == null) 
                      cookieValue = v; 
                  else
                      cookieValue = cookieValue + ";" + v; 
              }
          }
     } 
     return cookieValue; 
}

...

httppost.addHeader("Cookie", retrieveCookies(new URL(uploadUrl)));

JDK的类的CookieHandler可以幸运从“系统”店购买了饼干。 在这种情况下,它的浏览器存储,通过Java插件accesed。

排序的“手工作业”,但它的作品。

注:我发现代码这里



文章来源: Connection to a URL from within an applet using Apache's HttpClient vs using the JDK's URLConnection