Java HEAD / GET请求与Linux请求

时间:2015-04-13 18:12:37

标签: java linux http web

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

现在,当我使用Linux发送HEAD / GET请求时,我得到了200响应。那么这里的交易是什么?与Linux相比,请求的信息与Linux相比有何不同?提前谢谢你!

编辑:这是代码。我用来运行它的命令只是" 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();
    }

希望这有点帮助。

2 个答案:

答案 0 :(得分:0)

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

  1. 设置网络嗅探器以读取在两种情况下传递的HTTP标头。像wireshark这样的东西会有所帮助。
  2. 如果您发现标头有任何不同,可以尝试将Java代码与Linux脚本标头匹配。我假设两种情况下的网址完全匹配。
  3. 如果服务器发现有些可疑的东西,可能会智能地阻止这些请求 - 例如编程可能导致DOS攻击的大量请求等。
  4. 另一种可能性是,大学网址被屏蔽了一个负载均衡器,它将你的两个请求重定向到行为不同的不同服务器 - 在这种情况下,Linux / Java并不重要,只是偶然的运气。 / LI>

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

答案 1 :(得分:0)

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

我跟随之前的用户评论并区分标题,并尝试使它们匹配。 403通常表示服务器拒绝提交您的请求,因为它不喜欢标题中的内容。