2014-09-16 1 views
0

Я пытаюсь сделать запись в этой стандартной пружинной URL, чтобы имитировать аутентификации:Simulate пост в Граалей - весна authetication

http://www.whateverAddress.is:8080/Test/j_spring_security_check

Если я использую плагин плакате он работает отлично, Я поставил два параметра j_username и j_password и параметр заголовка X-Requested-With = XMLHttpRequest, и я действительно получил результат json.

Если я попытаюсь сделать это с помощью кода на Java, множество примеров в Google, похоже, не сработает. На данный момент я использую этот код, но я ничего не получаю взамен:

 HttpClient httpClient = new DefaultHttpClient(); 
     List<NameValuePair> postParams = new ArrayList<NameValuePair>(); 
     postParams.add(new BasicNameValuePair("j_username", "username")); 
     postParams.add(new BasicNameValuePair("j_password", "password")) 
     HttpPost httpPost = new HttpPost("http://www.whateverAddress.is:8080/Test/j_spring_security_check"); 
     httpPost.setEntity(new UrlEncodedFormEntity(postParams, HTTP.UTF_8)); 
     httpPost.addHeader("X-Requested-With", "XMLHttpRequest"); 
     HttpResponse response = httpClient.execute(httpPost); 
     HttpEntity entity = response.getEntity(); 
     String responseString = EntityUtils.toString(entity, "UTF-8"); 
     System.out.println(responseString); 

Если я печатаю ответ, (а не сущности) У меня есть следующие:

HTTP/1.1 302 Found [Сервер : Apache-Coyote/1.1, Set-Cookie: grails_remember_me = ""; Expires = Thu, 01-Jan-1970 00:00:10 GMT; Path =/Test, Set-Cookie: JSESSIONID = 247CF8B70D589F053DE4C937F2E16B9D; Path =/Test /; HttpOnly, Location: http://www.whateverAddress.is:8080/Test/login/authfail?ajax=true, Content-Length: 0, Date: Tue, 16 Sep 2014 12:04:12 GMT]

Какой код 302, так как я перенаправлен вместо кода 200 и json, так как Плакат плакат показывает мне.

UPDATE создать кнопку, которая запустим запрос Ajax пост, как я должен быть в состоянии сделать из стороны Java-кода, здесь код:

$(function() { 
    $('#btnPush').on('click', function() { 
     $.ajax({ 
      url: 'http://www.whateverAddress.is:8080/Test/j_spring_security_check', 
      type: 'POST', 
      data: { 
       j_username: 'username', 
       j_password: 'password' 
      }, 
      success: function(data, textStatus, jqXHR) { 
       alert('Success!!!'); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       alert('Fail!'); 
      } 
     }); 
    }); 
}); 

Глядя на запрос, отправленный, я см. заголовок и полученный JSON, все в порядке. Если я повторяю один и тот же заголовок в java-стороне, ничего не происходит. Я что-то пропустил

ПОСЛЕДНЕГО ОБНОВЛЕНИЯ - ЗАКРЫТЬ В основном после того, как сообщение будет сделано, мы должны следовать за переадресацию с Идент куки, чтобы получить нужную информацию:

 def headers = ["X-Requested-With": "XMLHttpRequest"] 
     def postParams = ["j_username": user, "j_password": pwd] 
     def url = "http://www.whatever.is:8080/test/j_spring_security_check" 
     def returnstring = doHttpPost(url, postParams, headers) 

    private String doHttpPost(String url, Map<String, String> params, Map<String, String> headers) { 

    HttpClient client = new DefaultHttpClient() 
    HttpPost post = new HttpPost(url) 
    String result 

    try { 

     List<NameValuePair> urlParameters = new ArrayList<NameValuePair>() 

     headers?.each { 
      post.setHeader(it.key, it.value) 
     } 

     params?.each { 
      urlParameters.add(new BasicNameValuePair(it.key, it.value)) 
     } 

     if (params) { 
      post.setEntity(new UrlEncodedFormEntity(urlParameters)) 
     } 

     HttpResponse response = client.execute(post) 

     if (response.getStatusLine()?.getStatusCode() == 200) { 
      result = response.getEntity().getContent()?.text 
     } 

     if (response.getStatusLine()?.getStatusCode() == 302) { 
      String redirectUrl = response.getHeaders("Location")?.value[0] 
      result = doHttpGet(redirectUrl, ["Cookie": response.getHeaders("Set-Cookie")?.value[0]]) 
     } 

     } catch (Exception ex) { 
     log.error(ex) 
     } finally { 
     post.getEntity().consumeContent() 
     return result 
     } 
    } 
+0

Вы перешли на 'loginUrl' после попытки входа в систему. Security Servlet/Filter не похоже, что запрос был отправлен как AJAX. Попробуйте добавить больше заголовков, чтобы сервер распознал их правильно. – injecteer

+0

Я пытаюсь реплицировать один и тот же заголовок, но не удачи – NiBE

+0

вы используете 2 разных URL: «http: // localhost: 8080/SkiBook/j_spring_security_check» и «http://www.whateverAddress.is:8080/Test/j_spring_security_check» – injecteer

ответ

1

вы, кажется, с помощью Android SDK для звонка. Это то, что я использую для данных POST для API REST (приведенный в действие Grails):

HttpClient httpClient = getHttpClient(); 
List<NameValuePair> postParams = new ArrayList<NameValuePair>(); 
postParams.add(new BasicNameValuePair("j_username", "username")); 
postParams.add(new BasicNameValuePair("j_password", "password")) 
HttpPost httppost = new HttpPost(url); 
httppost.setEntity(new UrlEncodedFormEntity(postParams, HTTP.UTF_8)); 
httpPost.addHeader("X-Requested-With", "XMLHttpRequest"); 
HttpResponse hr = httpClient.execute(httppost); 
JSONObject res = readStreamUsingReader(hr); 
+0

Большое спасибо, это намного лучший код. Я обновляю свой оригинальный пост. К сожалению, даже если я получил ответ от сервера, я все равно не смогу получить json. См. Мой оригинальный пост. большое спасибо – NiBE

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

  • Нет связанных вопросов^_^