2015-03-31 2 views
4

У меня есть следующий код, который будет вызывать сервер через HttpUrlConnection.перенаправление HttpUrlConnection на другой сервлет не происходит

String response = HttpUtil.submitRequest(json.toJSONString(), "http://ipaddr:port/SessionMgr/validateSession?sessionId=_78998348uthjae3a&showLoginPage=true"); 

Вышеуказанные линии будут вызывать следующий код:

public static String submitRequest(String request, String **requestUrl**) { 
    try { 
     URL url = new URL(requestUrl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     OutputStream os = conn.getOutputStream(); 
     os.write(request.getBytes()); 
     os.flush(); 
     if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + conn.getResponseCode()); 
     } 

     BufferedReader br = new BufferedReader(new InputStreamReader(
       (conn.getInputStream()))); 
     String output; 
     StringBuffer sb = new StringBuffer(); 
     while ((output = br.readLine()) != null) { 
      sb.append(output); 
     } 
     conn.disconnect(); 
     return sb.toString(); 

    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 
    return ""; 
} 

requestUrl будет идти в сервлет ниже:

public class ValidateSessionServlet extends HttpServlet { 
    String session = req.getParameter(sessionId); 
    if (session == null) { 
    // redirect to servlet which will display login page. 
    response.setContentType("text/html"); 
      String actionUrl = getIpPortUrl(request) 
          + PropertyConfig.getInstance().getFromIdPConfig(globalStrings.getCheckSSOSession()); 
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"> \n"); 
      out.write("<html><head><body onload=\"document.forms[0].submit()\">\n"); 
      out.write("<form method=\"POST\" action=\"" + actionUrl + "\">\n"); 
      out.write("<input type=\"hidden\" name=\"locale\" value=\"" + locale + "\"/>\n"); 
      out.write("<input type=\"hidden\" name=\"Sessionrequest\" value=\"" + true + "\"/>\n"); 
      out.write("</form>\n</body>\n</html>\n"); 
    } 
} 

В приведенном выше коде форма должна идти в сервлет как указано в actionUrl, но он снова переходит в сервлет, который находится на этапе (1).

1) Могу ли я узнать, можем ли мы сделать это выше html-формы на этапе (3) для отправки и перенаправления на сервлет в actionUrl.

В соответствии с приведенным выше кодом я суммирую требование. Если сеанс имеет значение null, я должен перенаправить пользователя на страницу входа в систему и проверить его на основе базы данных, а затем ответ должен перейти к шагу (1), возможно ли это?

+0

Может ли какое-нибудь тело рассказать мне, есть ли у него решение или нет? –

+0

Вы выполняете сообщение на стороне сервера, что вы делаете с выходом POST? Кстати, я думаю, что вы следуете опасному пути. Если вы хотите сделать RPC, как вызовы по HTTP, вы должны также полагаться на ответы JSON, смешанный режим (JSON или HTML) подвержен ошибкам (может быть сделано, но это вызовет всевозможные проблемы). – BigMike

+0

Выполняете ли вы виды автоматизации на действующих веб-сайтах, автоматический вход в систему и т. Д.? Если да, попробуйте использовать селен. –

ответ

3

Если вы хотите, чтобы ваши HttpUrlConnection для поддержки переназначения, вы должны настроить свой HttpUrlConnection так:

... 
conn.setRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1"); 
conn.setInstanceFollowRedirects(true); 
... 

Затем, если ваш сервер переадресует запрос где-то еще, conn будет приемником переадресованного ответа.

2

Чтобы уточнить, setInstanceFollowRedirects(true) определяет только, следует ли автоматически перенаправлять HTTP-пересылку экземпляром HttpURLConnection. В вашем конкретном случае кажется, что вы хотите перенаправить на сервлеты на основании того, session - null (или какое-либо другое условие, основанное на вашей конкретной логике приложения).

Правильное (и более устойчивое к ошибкам решение) заключается в проверке на наличие кодов состояния HTTP 3xx и ручную обработку перенаправления. Вот фрагмент кода, в качестве примера:

if (responseStatusCode != HttpURLConnection.HTTP_OK) { 
    switch(responseStatusCode){ 
     case HttpURLConnection.HTTP_MOVED_TEMP: 
      // handle 302 
     case HttpURLConnection.HTTP_MOVED_PERM: 
      // handle 301 
     case HttpURLConnection.HTTP_SEE_OTHER:       
      String newUrl = conn.getHeaderField("Location"); // use redirect url from "Location" header field 
      String cookies = conn.getHeaderField("Set-Cookie");  // if cookies are needed (i.e. for login) 
      // manually redirect using a new connection 
      conn = (HttpURLConnection) new URL(newUrl).openConnection(); 
      conn.setRequestProperty("Cookie", cookies); 
      conn.addRequestProperty("User-agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1"); 
     default: 
      // handle default (other) case 
    } 
} 

Приведенный выше код похож на то, что я использую для входа пользователей переадресовывает мое приложение, и я обнаружил, что это очень легко отлаживать. (В общем, я обрабатываю случаи кода состояния HTTP вручную, чтобы избежать ошибок в дороге.)

Наконец, я бы рекомендовал использовать хороший JSON lib, такой как json.org, для анализа ваших ответов.

Смежные вопросы