javahttp-redirectjsoup

Connection user jsoup redirect error


I'm trying to get an html table from a dynamic php page on my web server. The web server is a Zabbix frontend.

Here is my sample code:

doc = Jsoup.connect("http://192.168.209.178/zabbix/index.php").data("name", "Admin", "password", "password", "enter", "Enter", "request", "/zabbix/events.php").userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11").followRedirects(true).post();

System.out.println(doc.title());
System.out.println(doc.toString());

I put my params with data, so name is the login, password is obviously password, and request is an url redirect.

When I try tjis code, natively, connection is made whis "guest" Zabbix user. That means which have no rights to view what I want. jsoup is not using my Admin loggin. When I try to disable guest user is Zabbix, I have an error:

IOException: Too many redirects occurred trying to load URL

I think jsoup is making the post after the redirection. But redirection is made in my index.php, so...

I realy need to connect as Admin user. A workarround would be to set administrative password to guest (I tryied and it works).

Thank for your help, Regards. Olivier.


Solution

  • A logged-in user is often stored in the session. A session is usually maintained by cookies. Jsoup however doesn't retain cookies in subsequent/redirected requests. In fact, Jsoup does not automatically maintain cookies at all. Basically, you are not logged in anymore in the redirected page. In poorly designed websites which assume that cookies are undisableable this may indeed result in an infinite redirect loop.

    You have basically 2 options:

    1. Rewrite your Jsoup code so that you manually maintain the cookies. You can obtain response cookies by Response#cookies(). You can set cookies on the subsequent request by Request#cookie().

    2. Use a real HTTP client instead of Jsoup to maintain the cookies. Most HTTP clients, even the Java SE builtin URLConnection, allow you to transparently maintain cookies in subsequent HTTP requests without going through the hassle of manually collecting and setting cookies. Finally, you get the response of the HTTP client as InputStream and feed it to Jsoup which has also a parse() method taking an InputStream.