2013-07-24 1 views
0

한 번에 여러 번 동일한 https URL을 호출하는 데 문제가 있습니다. 첫 번째 요청은 성공하지만 일정하지 않은 시간이 지나면 401 HTTP 오류 코드 예외가 발생하여 사용자 자격 증명이 유효하지 않음을 알립니다.같은 URL에 대한 후속 호출이 세션 데이터를 공유하지 않도록하기 위해 java.net.URLConnection 객체를 처리하는 방법은 무엇입니까?

데이터베이스/서버 관리자와이 문제를 논의한 결과, 일정한 시간이 지나면 서버가 세션 데이터를 무효화하여 이후의 동일한 호출을 발생시키기 때문에 내가 경험 한 문제가 정상이라고 말해 줬습니다. 같은 사용자 자격 증명을 가진 URL은 401 HTTP 오류 코드가됩니다.

그는 다른 URLConnection 객체가 만들어야하는 모든 호출을 처리하도록 허용하면 만료 된 세션 데이터에 대해 걱정할 필요가 없다고 지적했습니다.

그의 설명은 이해할 수 있지만 아래 코드의 스 니펫처럼 동일한 사용자 자격 증명을 사용하여 동일한 URL에 대한 각 요청에 대해 새로운 URLConnection 객체를 이미 사용하고 있습니다. 그래서 내가 들었던 것이 맞다면, URLConnection 객체가 모두 동일한 기본 연결을 사용하고 있기 때문에 동일한 세션 데이터를 공유한다는 것이 문제라고 생각합니다.

내가 올바른 길을 가고 있다고 가정하면, 동일한 사용자 자격 증명으로 동일한 URL에 대한 새로운 요청을 할 때마다 만료 된 세션 데이터로 인해 문제가 발생하지 않도록 코드를 수정해야합니까? 기본 HttpsURLConnection 객체에서 disconnect()를 호출하면됩니까?

public static void main(String[] args) 
{ 
    String url = "https://...";//some https url 
    int x = 0; 
    while(true) 
    { 
     try 
     { 
      System.out.print("call#: " + (++x)); 

      //call download() with a valid username & password 
      String result = download(url, "some-valid-username", "some-valid-password"); 
      System.out.println(result); 
     } 
     catch(Throwable e) 
     { 
      //after hundreds of successful calls, 
      //a 401 HTTP error code exception 
      e.printStackTrace(); 
      break; 
     } 
    } 
} 

public static String download(String url, String user, String pass) throws IOException 
{ 
    //new URLConnection object 
    java.net.URLConnection connection = new java.net.URL(url).openConnection(); 
    connection.setRequestProperty("Authorization", 
      "Basic " + 
       javax.xml.bind.DatatypeConverter.printBase64Binary(
         (user + ":" + pass).getBytes("UTF-8"))); 

    //get response 
    InputStream is = null; 
    byte[] response = null; 
    try 
    { 
     is = connection.getInputStream(); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     byte[] bytes = new byte[16384]; 
     int x = 0; 
     while((x = is.read(bytes, 0, bytes.length)) != -1){ 
      stream.write(bytes, 0, x); 
     } 
     stream.flush(); 
     response = stream.toByteArray(); 
    } 
    finally 
    { 
     if (is != null) 
     { 
      is.close(); 
     } 
    } 
    //((javax.net.ssl.HttpsURLConnection)connection).disconnect();// ? 

    return response != null ? new String(response, "UTF-8") : null; 
} 
+0

나는 현재 해결책을 모르는 읽을 수 있지만, 당신은 Windows 플랫폼에있는 경우, "TCPView"라는 프로그램을 다운로드하고 실제로 코드 여부를 확인하시기 바랍니다 팁 : 매번 download()가 호출 될 때마다 "새로운 (새로운)"tcp 연결을 만듭니다. 팁 : thread.sleep()을 사용하여 각 호출간에 약간의 지연이 생겨 디버깅이 쉬워집니다. 결과를 알려주십시오. .. – Dreamer

답변

1

로그인 자격 증명을 기반으로 서버는 세션 ID를 생성하고 서버에서 유지 관리합니다. 후속 통화는 자격 증명이 아닌 세션 ID에 대해 유효성이 검사됩니다. 처음으로 세션 ID를 가져와 응용 프로그램에서 유지 관리해야합니다. 이후 호출을 위해 서버에 전달하십시오. 서버에 요청을 보내지 않으면 특정 정해진 기간 후에 세션이 만료됩니다.

.. 당신이 prob는 것이

http://en.wikipedia.org/wiki/Session_%28computer_science%29

관련 문제