2013-06-06 30 views
5

Tôi hiện đang làm việc trên trình duyệt web bằng cách sử dụng java. Tôi đang gửi yêu cầu GET theo cách thủ công bằng cách thiết lập kết nối tcp và sử dụng trình soạn thảo máy in.Gửi yêu cầu GET theo cách thủ công đến một trang web. 302 lỗi chuyển hướng

Tôi có thể kết nối với hầu hết các trang web như yahoo.com hoặc cracked.com và nhận được phản hồi, NHƯNG tôi không thể kết nối với trang web mục tiêu của mình - vinylengine.com. Nó sẽ luôn trả về lỗi 302.

Tôi đã so sánh yêu cầu gửi của mình với trình duyệt của tôi và chúng gần như giống hệt nhau.

tiêu đề của tôi:

GET/HTTP/1.1 
Host: www.vinylengine.com 

Phản Hồi của Tôi: tiêu đề

HTTP/1.1 302 Found 
Date: Thu, 06 Jun 2013 19:27:00 GMT 
Server: Apache 
Location: http://www.nakedresource.com/ 
Cache-Control: max-age=1209600 
Expires: Thu, 20 Jun 2013 19:27:00 GMT 
Content-Length: 213 
Content-Type: text/html; charset=iso-8859-1 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>302 Found</title> 
</head><body> 
<h1>Found</h1> 
<p>The document has moved <a href="http://www.nakedresource.com/">here</a>.</p> 
</body></html> 

của trình duyệt:

GET http://www.vinylengine.com/ HTTP/1.1 
Host: www.vinylengine.com 
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Cookie: __utma=72407316.18415374.1370488314.1370497873.1370543389.3; __utmz=72407316.1370488314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); SESSaf8d12283bdbdc5f5bbfb2aef054db6d=1f0676e5cab0ba2c5a80e76ea0bd6f75; __utmc=72407316; has_js=1; __utmb=72407316 
Connection: keep-alive 
If-Modified-Since: Thu, 06 Jun 2013 18:02:53 GMT 
If-None-Match: "2186d59ac297e0f1a43433fa61e8a94b" 

Code:

public void sendRequest(String extensionString, String urlString) 
{ 
    try 
    { 
     //BufferedReader inFromServer; 
     //PrintWriter outToServer; 
     //These 2 are initalized elsewhere 

     outToServer.println("GET " + extensionString + " HTTP/1.1"); 
     outToServer.println("Host: " + urlString); 

     outToServer.println(""); 
     outToServer.flush(); 

     String temp; 
     while((temp=inFromServer.readLine()) != null) 
     { 
      System.out.println(temp); 
     } 

     return; 
    } 
    catch (Exception e) 
    { 
     System.out.printf("sendRequest failed: %s",e); 
     return; 
    } 
} 

Tôi đã cố gắng thay đổi tên máy chủ để nakedresource.com, nhưng khi tôi làm điều đó, tôi nhận được mã nguồn trang web cho nakedresource.com và không vinylengine.com

+1

HTTP 302 có nghĩa là chuyển hướng, do đó bạn cần gọi lại URL được chuyển hướng – nidhin

+0

Vì vậy, bạn không làm điều tương tự như trình duyệt, sau đó tự hỏi tại sao kết quả lại khác? –

Trả lời

6

Các trang web trong câu hỏi là nhìn vào chuỗi tác nhân người dùng của bạn (Hoặc thiếu đó trong trường hợp của bạn).

Khi bạn nói rằng bạn đang thực hiện "gần như cùng một điều" với trình duyệt ... bạn nói đúng. Và máy tính rất kén chọn những thứ như thế.

Nếu bạn không cung cấp tiêu đề User-Agent:, bạn sẽ nhận được chuyển hướng.

> telnet www.vinylengine.com 80
cố gắng 67.225.154.112 ...
Kết nối với vinylengine.com.
Ký tự thoát là '^]'.
GET/HTTP/1.1
Host: www.vinylengine.com
Chấp nhận: */*

HTTP/1.1 302 Tìm thấy
...

Trong khi nếu bạn cung cấp một, bạn sẽ có được trang:

> telnet www.vinylengine.com 80
Cố 67.225.154.112 ...
Kết nối với vinylengine.com.
Ký tự thoát là '^]'.
GET/HTTP/1.1
Host: www.vinylengine.com
User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2. 5
Chấp nhận: */*

HTTP/1.1 200 OK
... (trang)

này thường được thực hiện bởi vì trang web đang cung cấp phiên bản khác nhau của nội dung để trình duyệt khác nhau được xác định bởi tiêu đề User-Agent. Rõ ràng câu trả lời của họ cho "không có User-Agent" là ... punt, và bạn sẽ được chuyển hướng đến thư mục gốc của trang gốc.

+0

+1 Chính xác tìm kiếm của tôi (thậm chí xuống cùng phiên bản zLib :). –

+0

Cảm ơn sự cố này đã được khắc phục! –

1

này có thể thực hiện được khi bạn đã định cấu hình proxy trong trình duyệt nhưng JVM của bạn không biết điều đó.

Cố gắng bắt đầu JVM của bạn với các đối số sau đây và xem nếu nó sửa chữa vấn đề:

-Dhttp.proxyHost=10.12.11.1 -Dhttp.proxyPort=8800 
+0

Vấn đề không phải là, vấn đề là trang web tìm chuỗi Tác nhân Người dùng. –

3
HttpURLConnection.setFollowRedirects(true); 

Nếu bạn đang sử dụng HttpURLConnection sử dụng mã ở trên.

Cũng tham khảo Example showing HTTP redirects

+2

Chỉ là một FYI, chuyển hướng là vì không có chuỗi 'User-Agent'. Sau đó, nó sẽ đưa bạn đến một trang web khác (cha mẹ) thay vì trang thực sự được đề cập. –

+0

Bạn luôn có thể tham khảo http://stackoverflow.com/questions/2529682/setting-user-agent-of-a-java-urlconnection để tìm hiểu cách thêm chuỗi tác nhân người dùng. – user1889970