0

我正在尝试通过我的浏览器使用我的 java 应用程序中的网站;这是我第一次尝试这样的事情,我担心我错过了一些东西。

我正在使用 apache httpcore 库使用 post 方法执行 http 请求,使用wireshark 我已经看到了 post 请求中的参数,并且我已经将它们添加到我使用 java 执行的请求中;标题相同。

如果我嗅探使用 java 发出的请求,我将无法捕获 http post 请求,而只能捕获 tcp 流量。

这就是我提出请求的方式:

HttpPost httpPost = new HttpPost("http://xxx.xxx");

httpPost.setHeader("Host", "xxx.xxx:xxxx");
.
.
.

HttpParams params = new BasicHttpParams();
params.setParameter("aaaa", "bbbb");
.
.
.

HttpResponse response = httpclient.execute(httpPost);

我错过了什么吗?

我应该检查其他东西吗?

非常感谢你的帮助!

4

1 回答 1

0

您必须通过在 HttpPost 上调用 .setEntity(HttpEntity) 方法来为您的发布请求提供正文。

  private void sendToPostProxy(HttpServletRequest request,
          HttpServletResponse response) throws IOException {
      //the url to forward too
      String url = "http://127.0.0.1:"+proxyPort+request.getRequestURI()
              +(request.getQueryString()==null?"":"?"+request.getQueryString());
      HttpPost get = new HttpPost(url);
      //I am streaming requests straight through, but there are many Entity types you can use
      get.setEntity(new InputStreamEntity(request.getInputStream(), request.getContentLength()));
      sendToProxy(request, response, get);
  }
  private void sendToProxy(HttpServletRequest request,
          HttpServletResponse response,HttpRequestBase get) throws IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    Enumeration headers = request.getHeaderNames();
    //copy headers
    while(headers.hasMoreElements()){
        String next = String.valueOf(headers.nextElement());
        String header = request.getHeader(next);
        if (!get.containsHeader(next)&&!"Content-Length".equalsIgnoreCase(next))
            get.addHeader(next, header);
    }
    try{
    //perform post
    HttpResponse proxied = client.execute(get);
    //set client headers
    for (Header h : proxied.getAllHeaders()){
        response.setHeader(h.getName(), h.getValue());
    }
    //stream to client
    HttpEntity body = proxied.getEntity();
    body.writeTo(response.getOutputStream());
    response.setStatus(HttpServletResponse.SC_OK);

    }catch(Exception e){
        e.printStackTrace();
        get.abort();
    }
}
于 2012-08-29T10:36:49.680 回答