2015-01-08 1 views
0

Java를 사용하여 웹 사이트에 로그인하려고하는데 성공했습니다. 아래는 내가 사용한 코드입니다.https/http 프로토콜 (Java)을 사용하여 로그인 한 후 웹 사이트를 탐색하는 방법

String query = "myquery"; 
    URL url = new URL(loginUrl); 
    HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

    con.setRequestMethod("POST"); 
    con.setRequestProperty("Content-length", String.valueOf(query.length())); 
    con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
    con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)"); 
    con.setDoOutput(true); 
    con.setDoInput(true); 

    DataOutputStream output = new DataOutputStream(con.getOutputStream()); 

    output.writeBytes(query); 
    output.close(); 

    DataInputStream input = new DataInputStream(con.getInputStream()); 

    for(int c = input.read(); c != -1; c = input.read()) { 
     System.out.print((char)c); 
     // this page returns JavaScript code 
    } 

이 후, 동일한 도메인의 다른 웹 페이지에 액세스하려고하므로 아래 코드를 시도했습니다.

URL url = new URL(anotherUrl); 
    HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

    ... similar to above code ... 

그러나이 페이지에는 다시 로그인하라는 메시지가 표시됩니다. URL 연결을 변경하는 과정에서 연결이 끊어 졌다고 생각합니다. (Onlt 로그인 페이지는 HTTPS 프로토콜을 사용하고 다른 페이지는 HTTP 프로토콜을 사용합니다.

어떻게 해결할 수 있습니까? 누군가 도와주세요

+0

당신이 사용하는 HTTPS를 쿠키를 보내려면 을, 단순히 우리가 쿠키 속성을 추가하는의 URLConnection의()를 연결 호출 두 번째 것은 HTTP입니다. 왜 연결 상태를 유지하려고합니까? – KyleM

+0

죄송합니다. 로그인 페이지 만 HTTPS를 사용하고 다른 페이지는 HTTP를 사용합니다. 그래서 나는 혼란 스럽다 ... – soonoo

+0

웹 브라우저에서 웹 사이트에 액세스하면 어떻게됩니까? HTTPS에서 HTTP로 변경됩니까? 로그인 상태입니까? – KyleM

답변

0

HTTP는 완전히 상태가 저장되지 않습니다. 사이트에 "로그인"한다는 생각은 HTTP 관점에서 쿠키를 설정하는 것으로 해석됩니다. 이러한 쿠키는 단순히 HTTP 헤더이며 브라우저가 요청할 때마다 전송됩니다. 따라서 당신이 로그인 상태를 유지하려면 응답 헤더에서 쿠키를 가져와 향후 요청과 함께 보내십시오.

열기 서버에 java.net.URLConnection의 :

URL myUrl = new URL("http://www.hccp.org/cookieTest.jsp"); 
URLConnection urlConn = myUrl.openConnection(); 
urlConn.connect(); 

루프 응답을 통해 헤더 쿠키를 찾고

가 응답에서 쿠키를 가져 오는 : 여기

방법입니다 : 서버는 단일 요청으로 여러 쿠키를 설정할 수 있으므로 "Set-Cookie"라는 헤더를 모두 찾으려면 응답 헤더를 반복해야합니다. 쿠키 열로부터

String headerName=null; 
for (int i=1; (headerName = uc.getHeaderFieldKey(i))!=null; i++) { 
    if (headerName.equals("Set-Cookie")) {     
    String cookie = urlConn.getHeaderField(i);    
    ...              

추출 쿠키 이름과 값 : 의 getHeaderField (INT 인덱스)에 의해 반환 된 문자열 방법 세미콜론으로 분리 된 이름 = 값의 연속이다(). 첫 번째 이름/값 쌍은 우리가 관심있는 실제 데이터 문자열 (예 : "sessionId = 0949eeee22222rtg"또는 "userId = igbrown")이며, 후속 이름/값 쌍은 쿠키 저장소를 관리하는 데 사용할 메타 정보입니다 (만료 될 때 등).

cookie = cookie.substring(0, cookie.indexOf(";")); 
    String cookieName = cookie.substring(0, cookie.indexOf("=")); 
    String cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.length()); 

이것은 기본적으로입니다. 이제 쿠키 이름 (cookieName)과 쿠키 값 (cookieValue)이 있습니다. 요청에 쿠키 값을 설정

:

값은 connect 메소드 호출하기 전에 설정해야합니다 :

String myCookie = "userId=igbrown"; 

가 쿠키를 추가

URL myUrl = new URL("http://www.hccp.org/cookieTest.jsp"); 
    URLConnection urlConn = myUrl.openConnection(); 

쿠키 문자열을 만들기를 요청 :

setRequestPrope rty (문자열 이름, 문자열 값);

메서드를 사용하면 이전 단계에서 만든 쿠키 문자열을 속성 값으로 전달하여 "쿠키"라는 속성을 추가합니다.

urlConn.setRequestProperty("Cookie", myCookie); 

서버에 쿠키 보내기 : 첫 번째 연결

urlConn.connect() 
+0

[link] http://www.hccp.org/java-net-cookie-how- to.html 답변 해 주셔서 감사합니다. 요청에 쿠키를 추가하려면 setRequestProperty() 메소드를 두 번 이상 사용하지 않아야합니다. (한 번에 setRequestProperty() 메소드를 사용하여 쿠키 추가) – soonoo

관련 문제