0

我是一名程序员,目前跨越 .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;
}

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

4

2 回答 2

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())
于 2014-12-05T23:05:25.800 回答
0

当这类事情失败或难以设置时,您可以将 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 强制您的应用程序网络请求然后重定向它。

我希望这可以帮到你。

于 2013-08-02T16:47:35.700 回答