Java의 HTTPS 웹 페이지에서 로그인하고 파일을 다운로드하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/421251

  •  05-07-2019
  •  | 
  •  

문제

HTTPS 웹 페이지에 로그인하고 Java를 사용하여 파일을 다운로드해야합니다. 나는 모든 URL을 미리 알고 있습니다.

baseURL = // a https URL;
urlMap = new HashMap<String, URL>();
urlMap.put("login", new URL(baseURL, "exec.asp?login=username&pass=XPTO"));
urlMap.put("logout", new URL(baseURL, "exec.asp?exec.asp?page=999"));
urlMap.put("file", new URL(baseURL, "exec.asp?file=111"));

Firefox와 같은 웹 브라우저에서 이러한 모든 링크를 시도하면 작동합니다.

이제 내가 할 때 :

urlConnection = urlMap.get("login").openConnection();
urlConnection.connect();
BufferedReader in = new BufferedReader(
    new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
in.close();

로그인 페이지 html을 다시 돌아 오면 다운로드를 계속 진행할 수 없습니다.

감사!

도움이 되었습니까?

해결책

Alnitak은 문제가 쿠키를 저장하고 반환 할 가능성이 높다는 데 동의합니다.

내가 사용한 또 다른 좋은 선택은입니다 httpclient 자카르타 커먼즈에서.

제어하는 서버 인 경우 쿼리 스트링 (HTTPS를 사용하는 경우에도)이 안전하지 않다는 사실을 제외하고는 주목할 가치가 있습니다. httpclient는 포스트를 사용하여 보내는 매개 변수를 지원합니다.

다른 팁

언급 된 바와 같이, 당신은 요청간에 세션 쿠키를 유지해야합니다 ( 쿠키 핸들러).

다음은 샘플 구현입니다.

class MyCookieHandler extends CookieHandler {

    private Map<String, List<String>> cookies = new HashMap<String, List<String>>();

    @Override
    public Map<String, List<String>> get(URI uri,
            Map<String, List<String>> requestHeaders) throws IOException {
        String host = uri.getHost();
        Map<String, List<String>> ret = new HashMap<String, List<String>>();
        synchronized (cookies) {
            List<String> store = cookies.get(host);
            if (store != null) {
                store = Collections.unmodifiableList(store);
                ret.put("Cookie", store);
            }
        }

        return Collections.unmodifiableMap(ret);
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders)
            throws IOException {
        List<String> newCookies = responseHeaders.get("Set-Cookie");
        if (newCookies != null) {
            String host = uri.getHost();
            synchronized (cookies) {
                List<String> store = cookies.get(host);
                if (store == null) {
                    store = new ArrayList<String>();
                    cookies.put(host, store);
                }
                store.addAll(newCookies);
            }
        }
    }

}

로그인 요청이 로그인하는 것을 막는 다른 문제가있을 수 있음에도 불구하고 로그인 페이지가 생성하는 쿠키를 저장하고 반환하지 않으면 다운로드 페이지로 진행할 수 없을 것입니다.

HTTP 자체가 상태가 없기 때문에 현재 코드에서는 원격 서버가 로그인 한 두 번째 다운로드 요청이 방금 로그인 한 동일한 사용자로부터 나온 것으로 알려주는 방법이 없습니다.

나는 Java Curl을 살펴 보라고한다 http://sourceforge.net/projects/javacurl. HTTPS 웹 사이트에 로그인하고 내용을 다운로드하기 전에 사용했습니다. 브라우저 ID 등을 스푸핑하는 등의 기능이 있습니다.이 기능은 로그인으로 다시 리디렉션되는 문제를 해결할 수 있습니다.

그들은 이클립스 플러그인을 제공하지만 나는 그것을 사용하지 않고 잘 작동합니다.

또는 WGET를 사용하여 Java에서 호출 할 수 있습니다.

아마 당신은 시도하고 싶을 것입니다 httpunit. 웹 사이트 테스트를 염두에두고 작성되었지만 문제가 발생할 수 있습니다.

그들의 웹 사이트에서 :

"... Java로 작성된 HTTPUNIT는 양식 제출, JavaScript, 기본 HTTP 인증, 쿠키 및 자동 페이지 리디렉션을 포함하여 브라우저 동작의 관련 부분을 모방하며 Java 테스트 코드를 텍스트로 XML DOM, XML DOM으로 검사 할 수 있습니다. 또는 형태, 표 및 링크의 용기. "

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top