2013-11-13 4 views
0

Я хочу получить доступ к своему веб-сайту, для которого требуется сначала базовое разрешение, а затем отправить параметры (ключевое слово поиска) на мою домашнюю страницу.Servlet не получает параметры после перенаправления (код ответа 302)

Мой код может передавать основное разрешение и получать текст ответа, однако я не могу получить результат поиска, но вместо этого получить код домашней страницы.

Таким образом, я напечатал параметры.size(), и он возвращает 0, поэтому я сомневаюсь, что метод перенаправления HttpClient не передает параметры после базовой авторизации.

После моего кода, который пытается получить результат поиска:

List<NameValuePair> params = new ArrayList<NameValuePair>(); 
params.add(new BasicNameValuePair("search_keyword", "test")); 
params.add(new BasicNameValuePair("search_size", "50")); 

DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {     
    public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { 
     boolean isRedirect=false; 
     try { 
      isRedirect = super.isRedirected(request, response, context); 
     } catch (ProtocolException e) { 
      throw e; 
     } 
     if (!isRedirect) { 
      int responseCode = response.getStatusLine().getStatusCode(); 
      if (responseCode == 301 || responseCode == 302) { 
       return true; 
      } 
     } 
     return isRedirect; 
    } 
}); 

String encoding = Base64Encoder.encode("admin:password"); 
HttpPost httppost = new HttpPost("http://127.0.0.1/MySystem/home"); 
httppost.setHeader("Authorization", "Basic " + encoding); 
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 

//Execute and get the response. 
HttpResponse response = httpclient.execute(httppost); 
int responseCode = response.getStatusLine().getStatusCode(); 

switch(responseCode) { 
    case HttpURLConnection.HTTP_OK: 
     HttpEntity entity = response.getEntity(); 
     List<NameValuePair> parameters = new ArrayList<NameValuePair>(URLEncodedUtils.parse(entity)); 
     System.out.println("parameters size: "+parameters.size()); 
     for(NameValuePair p:parameters) 
      System.out.println("parameter: "+ p.getName() + p.getValue()); 
     if(entity != null) { 
      responseText = EntityUtils.toString(entity); 
      System.out.println("responseText: "); 
      System.out.println(responseText); 
     } 
     break; 
    default: 
     throw new Exception("Failed to pass the basic authorization. Response code: "+responseCode); 
} 

Обновлено:

Следующее условие возвращает истину:

if (responseCode == 301 || responseCode == 302) { 
    return true; 
} 
+0

вот как это предполагается перенаправление на работу .... обходные пути вы можете взглянуть на http://stackoverflow.com/questions/5405718/jsf- перенаправлять к URL-как-пост-не-как-получить – arajashe

ответ

0

Ok, я нашел обходной путь , В принципе, хотя 302 перенаправит меня на другую страницу, основной сеанс авторизации передается в текущем httpclient.

Решение состоит в том, чтобы повторно использовать httpclient под case HttpURLConnection.HTTP_OK: , а также закрыть обработчик буфера сущности, чтобы предотвратить выделение «все еще выделенное».

Вот пример кода:

String line; 
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); 
StringBuilder sb = new StringBuilder(); 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 

br.close(); 
responseText = sb.toString(); 
.... 

HttpPost httppost2 = new HttpPost("http://127.0.0.1/MySystem/home"); 
httppost2.setHeader("Authorization", "Basic " + encoding); 
httppost2.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 
HttpResponse response2 = httpclient.execute(httppost2); 
HttpEntity entity2 = response2.getEntity(); 
Смежные вопросы