【问题标题】:Java HEAD/GET request versus Linux requestJava HEAD/GET 请求与 Linux 请求
【发布时间】:2015-04-13 18:12:36
【问题描述】:

希望这是一个简单的问题。我正在尝试向大学服务器发出 HEAD/GET 请求,以确保服务器甚至存在。 HEAD 请求首先发送,如果失败,我们发送 GET 请求。不幸的是,这两个请求都返回 403。这是使用我制作的一个小 Java 程序。

现在,当我使用 Linux 发送 HEAD/GET 请求时,我都会收到 200 响应。那么这里的交易是什么?与 Linux 相比,Java 请求的信息有区别吗?提前谢谢你!

编辑:这是代码。我用来运行它的命令只是“java FILE URL”。我比较它的 Linux 命令是“curl -I URL”。

public static boolean urlHeadRequest(String link)
{
    PageConnection conn;
    boolean problem = false;
    int status;
    URL url;
    try{
        if(link.indexOf("#") != -1){
            link = link.substring(0, link.lastIndexOf("#"));
        }

        url = new URL(link);
        conn = new PageConnection(url);
        System.out.println("Requesting: " + link);
        //Set the request method to HEAD - only get back header information
        conn.setRequestMethod("HEAD");
        status = conn.getHttpResponseCode();
        System.out.println("\tHEAD request status: " + status);
        //Try GET request if HEAD fails, this takes longer but is more likely to succeed
        if ((status >= 200) && (status < 299)){
            System.out.println("Server is good.");
              }
        else { //Server is down
            conn = new PageConnection(url);
            conn.setRequestMethod("GET");
            status = conn.getHttpResponseCode();
            System.out.println("HEAD request failed. Using GET request...");
            if ((status < 200) || (status >= 299)){
                problem = true;
                System.out.println(link + " is unreachable with status " + status);
            }
            else{
                problem = false;
                System.out.println("URL is reachable using GET request with status " + status);
            }
        }
    }
    catch(Exception e){
        System.out.println("Error: Server is not responding or does not exist.");
    }



    return problem;

}

PageConnection 是一个自定义类。我认为这两个功能可能是相关的:

public void setRequestMethod(String method) throws ProtocolException
    {
            huc.setRequestMethod(method);
    }

    /**
     * @return HTTP status code, an integer between 0 and 999.  For details see <a href="http://www.w3.org/Protocols/HTTP/HTRESP.html">W3C HTTP Response Codes</a>
     * @throws IOException
     */
    public int getHttpResponseCode() throws IOException
    {
            this.huc.getErrorStream();
            return this.huc.getResponseCode();
    }

希望这会有所帮助。

【问题讨论】:

  • 我按照下面的建议设置了用户代理,但它似乎没有用。 huc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 我会尝试区分标题,但这需要一些时间。谢谢大家的建议。

标签: java linux http web


【解决方案1】:

这不是一个需要回答的直截了当的问题。但是根据给定的输入,我会尝试提出建议。

  1. 设置网络嗅探器以读取在这两种情况下传递的 HTTP 标头是什么。像 wireshark 这样的东西会有所帮助。
  2. 如果您发现标头有任何差异,您可以尝试将 Java 代码与 Linux 脚本标头匹配。我假设这两种情况下的网址完全匹配。
  3. 如果服务器发现有问题,甚至可能会智能地阻止请求 - 例如编写了许多可能导致 DOS 攻击等的请求。
  4. 另一种可能性是大学 url 被负载平衡器屏蔽,该负载平衡器将您的两个请求重定向到行为不同的不同服务器 - 在这种情况下 Linux / Java 无关紧要,只是碰巧。

如果可能,请分享正在使用的 url、java 代码和 linux 脚本/命令,以便社区可以提供帮助。

【讨论】:

    【解决方案2】:

    您是否设置了用户代理?有时安全策略会阻止意外的代理来减少自动爬虫(因为所有合法的浏览器流量都会在那里提供一个变量)。

    我会按照以前的用户评论和区分标题,并尝试使它们匹配。 403 通常表示服务器拒绝处理您的请求,因为它不喜欢标头中的内容。

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多