【问题标题】:I am having difficulty with Fiddler detecting HttpClient.execute(get) from a Java Application我在 Fiddler 从 Java 应用程序检测 HttpClient.execute(get) 时遇到困难
【发布时间】:2013-08-02 16:16:14
【问题描述】:

我是一名程序员,目前跨界于 .net 和 Java 之间,但我更倾向于 .net,对 java 的经验有限。我有一个 Java 应用程序,不是我自己开发的,它执行 httpClient 执行(get)(get 是一个 HttpsFactory)以从 asp 经典代码中获取响应,该代码位于通过带有查询字符串的特定 url 找到的不同代码服务器上存储用户认证信息。不要问我为什么。

我们的 qa 团队正在测试的用户之一没有返回良好的响应,因此我正在尝试使用 fiddler 来查看我们得到了什么。我可以看到它正在连接,因为如果我输入了在 asp 端验证的格式错误的密码。它生成了正确的错误消息,我们将其取回。 Fiddler 没有检测到任何这些。我查看了提琴手视线,尝试将我的 jvm 配置为通过提琴手代理服务器。但我无法让它工作。我正在运行我认为是最新的 java 版本 1.7.0.21。

我在命令提示符下运行了以下命令

jre -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 和 jre -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 MyApp

并且 jre 无法识别。我也试过了:

java -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 MyApp 和 java -DproxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888

属性无法识别

我也试过了

java -Dhttp.proxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888

我只是了解 java 命令的用法。

我还尝试在 http 连接之前将以下内容嵌入到我的代码中,但仍然没有检测到。

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyPort", "8888");

这是我正在运行的 java 代码。

public String getHttpConnect(User user) {
    HttpClient client=https.getHttpClient();
    InputStream instream=null;
    HttpEntity entity=null;
    HttpGet get = https.getHttp(user);
    try {
            response = client.execute(get);
            entity = response.getEntity();
        if (entity != null) {
             instream = entity.getContent();
             Document document= read.read(instream);
            Element root = document.getRootElement();
            String content = root.elementText("permission");
            if (content.equals("OK")) {
                message = Global.CONNECT_SUCCESS;
            } else {
                message = ErrorMsg.CONNECT_FAIL;
            }
        }

    }catch (Exception e) {
        message = ErrorMsg.CONNECT_EXCEPTION;
        get.abort();
        log.error("HttpConnect error: "+e.toString());
    }finally{
        try {
            if(instream!=null)instream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("Inputstream exception "+e.toString());
            log.error("Inputstream close exception: "+e.toString());
            e.printStackTrace();
            message = ErrorMsg.CONNECT_EXCEPTION;
        }
        client.getConnectionManager().shutdown();
    }
        return message;
}

public HttpClient getHttpClient() {
    HttpClient client = new DefaultHttpClient();
    client = WebClientDevWrapper.wrapClient(client);
    client.getParams().setParameter(
            CoreConnectionPNames.CONNECTION_TIMEOUT,
            Global.CONNECTION_TIMEOUT);// connect timeout 
    client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
            Global.RESPONSE_TIMEOUT);// send data read timeout 
    return client;
}

public HttpGet getHttp(User user) {
    String psw = user.getAccountpsw();
    StringBuffer connectUrl = new StringBuffer();
    if (Global.CURRENT_RUN_TYPE.equals(Global.BETA)) {
        connectUrl.append(Global.DEFAULT_LOGIN_URL_BETA);
    } else {
        connectUrl.append(Global.DEFAULT_LOGIN_URL_LIVE);
    }
    connectUrl.append("?usr=");
    connectUrl.append(user.getAccountname());
    connectUrl.append("&pwd=");
    connectUrl.append(psw);
    connectUrl.append("&vers=2.5.20&");
    connectUrl.append(random());
    // connectUrl.append("&SkipCheckForFiles=TRUE");
    StringBuffer logConnect = new StringBuffer();
    logConnect.append("Logging into server using URL:");
    logConnect.append(Global.LOG_NEWLINE);
    logConnect.append(Global.DES.getLogEncString(connectUrl.toString()));
    logConnect.append(Global.LOG_NEWLINE);
    log.info(logConnect);
    HttpGet get = new HttpGet(connectUrl.toString());
    return get;
}

感谢您的所有帮助,无论结果如何。

【问题讨论】:

  • 1> 你用的是什么JVM?它是否有一个允许设置代理设置的控制面板小程序? 2> 你用的是什么网址?是 HTTPS 吗?如果是这样,您是否已将 Fiddler 配置为解密 HTTPS?您是否已将 Java 配置为信任 Fiddler 的根证书?你看过stackoverflow.com/questions/6780128/…
  • 抱歉没有及时回复。我一直被其他错误跟踪。我正在使用具有 jdk7 的 glassfish4。我的 Eclipse 也设置为在 1.7 上运行。我不熟悉它是否有小程序控制面板或它在哪里。我尝试连接的 url 不是 https url。我将查看下面的代码和上面的链接。谢谢!

标签: java httprequest fiddler


【解决方案1】:

试试这个:

     HttpHost proxy = new HttpHost("localhost", 8888);
     CloseableHttpClient client = HttpClients.custom().setProxy(proxy).build();
     HttpGet get_request = new HttpGet(url);

     HttpResponse r = client.execute(get_request);
     String Document = EntityUtils.toString(r.getEntity())

【讨论】:

    【解决方案2】:

    当这类事情失败或难以设置时,您可以将 Fiddler 设置为反向代理模式。

    基本上,您要做的是在您的 java 代码中,将您的 http 访问到具有特定端口的本地机器上的某个组成的 url。然后在 Fiddler 中,您可以使用在 OnBeforeRequest 方法中添加的简单 Fiddler 脚本,如下所示:

    //PROXY to different server example
    if(oSession.HostnameIs("http://localhost:8989/path/to/whatever/")){
         oSession.hostname = "http://real/path/to/whatever/on/the/internet";    
    }
    

    以下是有关如何在反向代理模式下设置 Fiddler 的更多信息:http://fiddler2.com/documentation/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy

    这将有效地完成同样的事情并允许您查看所有流量。唯一的缺点是你必须临时修改你的java代码来解决这个问题。此方法也适用于任何平台 java、.net、php 等...因为您只是通过 Fiddler 强制您的应用程序网络请求然后重定向它。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。我相信是当地的防火墙阻止了我这样做。不幸的是,我无法控制。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多