Отправка HTML-формы с Java - PullRequest
5 голосов
/ 01 марта 2012

Я пытаюсь создать приложение для входа в сеть кампуса.Я получил довольно далеко, но теперь я застрял.

Я нахожусь в точке, где Java возвращает мне страницу, которая содержит простую форму, которая должна автоматически отправлять:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">   
<body onload="document.forms[0].submit()">       
<noscript>     
    <p>      
        <strong>Note:</strong> Since your browser does not support JavaScript,                you must press the Continue button once to proceed.            
    </p>        
</noscript>                

<form action="url" method="post">
    <div> 
        <input type="hidden" name="RelayState" value="ss:mem:43141e4108638211a81427d145c7e9de"/>        

        <input type="hidden" name="SAMLResponse" value="base64string"/>         
    </div>    
    <noscript>          
        <div>    
            <input type="submit" value="Continue"/>      
        </div>     
    </noscript>     
</form>     
</body></html>

Когда я копирую эту строку в файл .html и нажимаю на кнопку «Отправить», она просто регистрирует меня.Теперь я пытаюсь сделать это в Java, поэтому я извлекаю RelayState и SAMLResponse и использую следующий код для отправки:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

String params = "RelayState="+relayState+"&SAMLResponse="+saml;
System.out.println(params.length());

urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConnection.setRequestProperty("Content-Length", Integer.toString(params.getBytes().length));
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2");


urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);

DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
wr.writeBytes(params);
wr.flush();
wr.close();

InputStream in = new BufferedInputStream(urlConnection.getInputStream());

DataInputStream dis = new DataInputStream(new BufferedInputStream(in));

String fullPage = "";
String s;
while ((s = dis.readLine()) != null)
{
    fullPage += s;
}

urlConnection.disconnect();

Этот код возвращает 500 - внутреннюю ошибку сервера.Чего мне не хватает?

Чтобы проверить, что было отправлено, я изменил URL на простой print_r ($ _ POST) и print_r (getAllHeaders ()), и вот что я получил:

//when I submit using java:
Array(    
    [Accept] => text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2    
    [Connection] => keep-alive    
    [Content-Length] => 14176    
    [Content-Type] => application/x-www-form-urlencoded    
    [Host] => xxx   
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
)

Array(    
    [RelayState] => ss:mem:43141e4108638211a81427d145c7e9de
    [SAMLResponse] => base64string
)



//when I submit by copying the string to my browser and clicking submit
Array
(
    [Accept] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [Accept-Encoding] => gzip, deflate
    [Accept-Language] => en-us,en;q=0.5
    [Connection] => keep-alive
    [Content-Length] => 14204
    [Content-Type] => application/x-www-form-urlencoded
    [DNT] => 1
    [Host] => xxx
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
)
Array
(
    [RelayState] => ss:mem:43141e4108638211a81427d145c7e9de
    [SAMLResponse] => base64string
)

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

1 Ответ

2 голосов
/ 01 марта 2012

Если у вас есть доступ к журналам сервера, это может помочь. Состояние 500 генерируется, когда происходит внутренняя ошибка сервера. Это означает, что вы делаете что-то , которое не может быть успешно обработано сервером.

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

Если вы думаете, что все в порядке, но все равно не работает, возможная причина в том, что вы не имеете гражданства. Когда браузер впервые заходит на сайт, он получает идентификатор сеанса, отправленный в виде специального файла cookie. Файлы cookie отправляются в заголовке ответа с именем Set-Cookie. Браузер берет содержимое этого заголовка и отправляет его обратно как заголовок запроса «Cookie». В этом разница между вашим приложением и браузером.

Теоретически сервер не должен выходить из строя по этому запросу. Он просто должен перенаправить вас снова на страницу входа. Но похоже, что на стороне сервера есть ошибка: она просто не может обработать ваш «неправильный» запрос и выдает исключение.

Кстати, если вы хотите сделать вещи проще, пользователь HttpClient с jakarta.apache.org. Он поддерживает режим полного сеанса, так что вам не нужно иметь дело с мельчайшими подробностями протокола HTTP. Но вы также можете использовать обычный HttpConnection, если хотите. \

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...