java - 使用 Apache 的 HttpClient 与使用 JDK 的 URLConnection 从 applet 中连接到 URL

标签 java session applet httpclient urlconnection

在下面的代码中,我已验证如果使用 JDK 的 URLConnection 类,从小程序内连接到 URL 会保留浏览器的 session 。但是,如果使用 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();
        }
    }
}

最佳答案

这是通过套接字实现自己的 URL 连接的库的常见问题。显然,URLConnection 类的JRE 实现可以直接获取浏览器信息。我们不得不采用上面 oscargm 提到的技术,即在应用程序服务器上将请求 cookie 写入小程序的参数并使用 JavaScript 获取浏览器的文档 cookie(这是针对 SSO 的情况,其中 cookie 集可能因中间代理——代理服务器而不同)。请注意,如果 cookie 是 HttpOnly——javascript 代码将失败。

关于java - 使用 Apache 的 HttpClient 与使用 JDK 的 URLConnection 从 applet 中连接到 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1216165/

相关文章:

java - Java 小程序中的背景图像

java - 我似乎无法修复 JApplet 错误

java - 在 Java Applet 中加载图像

java - 使用JAVA对象和输入数据进行赋值

java - 使用 Appium 库在 android studio 中构建 gradle 文件时出错

java - 验证 plsql block

javascript - jQuery 脚本问题,为用户提供一个带有两个 PB 的弹出对话框。一个用于继续 session ,另一个用于结束 session

java - 用 Kotlin 编写的 Android 库,为 Java 应用程序提供支持

php - 如果值尚未在 session 数组中,如何将新项目添加到 session 数组中? PHP

session - 生产环境中的 Tomcat 集群/负载均衡性能