2015-05-20 3 views
1

Я пытаюсь отправить запрос POST для формы входа в систему «http://localhost/cilogin/login/» и получить заголовки ответов из соединения URL-адреса JAVA. Сама форма входа получает перенаправление после входа в систему «http://localhost/cilogin/login/success».java post form и получить заголовки ответов после перенаправления

Я пытаюсь обнаружить перенаправление HTTP 302 через JAVA. Но я получаю HTTP 200 только в заголовках ответов, которые я выбрал. Это как если JAVA игнорирует перенаправление. Пожалуйста, помогите. Код приведен ниже:

private boolean doLogin(String pass) throws IOException 
     { 

      String url ="http://localhost/cilogin/login/"; 

      URL obj = new URL(url); 
      HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
      con.setInstanceFollowRedirects(true); //you still need to handle redirect manully. 
      HttpURLConnection.setFollowRedirects(true); 
      con.setDoOutput(true); 
      con.setRequestMethod("POST"); 
      con.setRequestProperty("Accept-Charset", "UTF-8"); 
      con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 

      con.connect(); 
      String charset = "UTF-8"; // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name() 
      String param1 = "pd"; 
      String param2 = pass; 
// ... 

      String query = String.format("log=%s&pwd=%s&Sub=login", 
     URLEncoder.encode(param1, charset), 
     URLEncoder.encode(param2, charset)); 


      OutputStream output = con.getOutputStream(); 
      output.write(query.getBytes(charset)); 

      int responseCode = con.getResponseCode(); 

      System.out.println("PASS= "+pass+" code = "+responseCode); 

      Map<String, List<String>> map = con.getHeaderFields(); 

      for (Map.Entry<String, List<String>> entry : map.entrySet())  { 

       String key = entry.getKey(); 
       String val = entry.getValue().get(0); 
       if(responseCode == 302 && key.equals("Location") && val.equals("http://localhost/cilogin/login/success")) 
       { 
        con.disconnect(); 
        return true; 
       } 
      } 

      con.disconnect(); 
      return false; 
     } 

Java Response является:

PASS= abc code = 200 

Здесь "а" является строка передается метода doLogin от внешнего

+0

Также возможно, что ваша клиентская библиотека http обрабатывает перенаправление, так что вы просто видите 200 на последнем запросе после повторного непосредственный. – redge

+0

Согласен. Например, библиотека HttpClient от Apache также автоматически обрабатывает перенаправления GET. Существуют ли стратегии перенаправления, которые вы можете настроить для своей библиотеки HttpClient? – fishi

+0

Существует опция в библиотеке HttpClient Apache http://hc.apache.org/httpcomponents-client-4.2.x/tutorial/html/httpagent.html#d5e1169, чтобы получить код состояния, перенаправляется –

ответ

1

Правильного код:

private boolean doLogin(String pass) throws IOException 
     { 

      String url ="http://localhost/cilogin/login/"; 

      URL obj = new URL(url); 
      HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
      //HttpURLConnection.setFollowRedirects(true); 
      con.setInstanceFollowRedirects(false); //essential for capturing 302 redirect on successful login 

      con.setDoOutput(true); 
      con.setRequestMethod("POST"); 
      con.setRequestProperty("Accept-Charset", "UTF-8"); 
      con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 

      con.connect(); 
      String charset = "UTF-8"; // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name() 
      String param1 = "pd"; 
      String param2 = pass; 
// ... 

      String query = String.format("log=%s&pwd=%s&Sub=Login", 
      URLEncoder.encode(param1, charset), 
      URLEncoder.encode(param2, charset)); 


      OutputStream output = con.getOutputStream(); 
      output.write(query.getBytes(charset)); 

      int responseCode = con.getResponseCode(); 

      System.out.println("PASS= "+pass+" code = "+responseCode); 

      Map<String, List<String>> map = con.getHeaderFields(); 

      for (Map.Entry<String, List<String>> entry : map.entrySet())  { 

       String key = entry.getKey(); 
       String val = entry.getValue().get(0); 
       //System.out.printf("%s: %s\n", key, val); 
       if(responseCode == 302 && key!=null && key.equals("Location") && val.equals("http://localhost/cilogin/login/success")) 
       { 
        con.disconnect(); 
        return true; 
       } 
      } 

      con.disconnect(); 
      return false; 
     } 
Смежные вопросы