Попытка получить HTTP-сессию DOMINO с использованием HttpClient - КОД ОТВЕТА всегда равен 200
Мой Domino Sever включен для аутентификации сеанса, а номер порта HTTP настроен на 8080.
Когда я выполняю приведенную ниже программу для получения HTTP-сессии в домино, я всегда получаю следующее.
Я знаю, КОД ОТВЕТА 200 указывает на бесперебойную работу. Но я не вижу ни одного сеанса HTTP, созданного на сервере. Даже если я предоставлю неверные учетные данные для UsernamePasswordCredentials("xxxxx", "xxxxx"), он все равно возвращает 200 в качестве кода ответа. Есть предложения по этому поводу?
public class ClientAuthentication {
public static void main(String[] args) {
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
httpclient.getCredentialsProvider().setCredentials( new AuthScope("10.40.xx.xx", 8080),
new UsernamePasswordCredentials("xxxxx", "xxxxx"));
HttpPost httppost = new HttpPost("http://10.40.xx.xx:8080/names.nsf?Login");
System.out.println("executing request" + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK){
System.out.println("---------------OKAY OKAY-------------------------");
System.out.println("RESPONSE CODE " + response.getStatusLine().getStatusCode());
}
if (entity != null) {
System.out.println("Response content length: " + entity.getContentLength());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ВЫХОД:
executing requestPOST http://10.40.xx.xx:8080/names.nsf?Login HTTP/1.1
---------------OKAY OKAY-------------------------
RESPONSE CODE 200
Response content length: 4256
2 ответа
Вы настроены для аутентификации сеанса. но вы пытаетесь выполнить базовую аутентификацию с помощью getCredentialsProvider по умолчанию. Ответ 200, который вы получаете, является фактической формой входа в систему аутентификации сеанса, которую вы должны POST.
Правильная последовательность
- Сделайте GET с URL базы данных, в которую вы входите
- Получите 200 с формой входа на сервер в качестве ответа
- Заполните пары имя пользователя и пароль имя / значение для данных формы и отправьте их
Теоретически вы должны написать свой собственный класс, который реализует интерфейс CredentialsProvider, адаптированный к форме аутентификации сеанса Domino, и использовать его с вашим собственным классом DominoHttpClient, расширяющим AbstractHttpClient, для чистой реализации этой последовательности; но я не думаю, что это действительно стоит того.
Нарасимха, как заметил @Richard, у вашего запроса нет идентификатора сеанса, когда вы его публикуете. Сервер рассматривает его как новый запрос и, следовательно, предлагает страницу входа.
Теперь, чтобы обойти эту проблему, вам необходимо войти на сайт хотя бы один раз, прежде чем отправлять запрос на вход в систему. Вы можете запросить страницу входа для этого.
Поставьте следующий код перед выполнением почтового запроса.
HttpMethod method = new GetMethod("http://10.40.xx.xx:8080/names.nsf?Login");
httpclient.executeMethod(method);
Это создаст идентификатор сеанса, который будет передан в последующих запросах.