2

I want to login to a website from my Java desktop application. I have to write Username & Password using OutputStreamWriter. I am able to login to other website successfully from my application but not the one which I really want to. After analyzing the page source of that website I found that the ID of those two text boxes for Username & password changes with every request and every time the page refresh.

<input type="text" name="UserName_88515" id="UserName_88515" />

In the id the last 5 digits changes every time, so I decided to read the page source, retrieve those five digits and then write credentials to log in to that website.

public class LoginHandler {

static boolean isLoggedIn = false;
static String responseText, myText;

public void login(String usrname, String password, String cookys, String sessionCode) {

    try {

        URL url = new URL("http://www.somewebsite.com/home.php?session="
                + sessionCode);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");
        conn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0");
        conn.setRequestProperty("Cookie", cookys);
        conn.setDoOutput(true);

        final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        final StringBuilder response = new StringBuilder();
        myText = response.toString();
        String line;

        while ((line = rd.readLine()) != null) {
            response.append(line);
        }
        rd.close();

        final String text1 = response.toString();
        final int starIndex = text1.indexOf("UserName_");
        final int endIndex = starIndex + 15;
        System.err.println("This is starIndex" + starIndex);
        System.err.println("This is endIndex" + endIndex);
        final String avc = text1.substring(starIndex, endIndex);
        System.err.println("This is avc\n" + avc);
        final String fin = avc.substring(10, 15);
        System.err.println("This is fin\n" + fin);

        final String data1 = URLEncoder.encode("MessageLength", "UTF-8")
                + "=" + URLEncoder.encode("140", "UTF-8") + "&"
                + URLEncoder.encode("UserName_" + fin, "UTF-8") + "="
                + URLEncoder.encode("username", "UTF-8") + "&"
                + URLEncoder.encode("Password_" + fin, "UTF-8") + "="
                + URLEncoder.encode("password", "UTF-8") + "&"
                + URLEncoder.encode("LoginNowbtnDiv", "UTF-8") + "="
                + URLEncoder.encode("Login Now", "UTF-8") + "&"
                + URLEncoder.encode("LoginNow", "UTF-8") + "="
                + URLEncoder.encode("Login Now", "UTF-8");

        System.err.println("THIS IS Data1:\n " + data1);

        final OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data1);
        wr.flush();

        final BufferedReader rd1 = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        final StringBuilder response1 = new StringBuilder();
        String line1;

        while ((line1 = rd1.readLine()) != null) {
            response1.append(line1);
        }

        final String text2 = response1.toString();
        System.err.println("This is second response\n" + text2);
        rd1.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
}

For that I have written the following code, but I was getting following error:

Cannot write output after reading input
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
android_newbie
  • 667
  • 2
  • 14
  • 32

1 Answers1

1

see the answer to this question - Cannot write output after reading input the short version is that the underlying HttpURLConnection (conn) cannot be reused and you'll need to open a new one.

generally though, it'll be easier for yuo if you use a better library for your http code, like HTTPComponents

Community
  • 1
  • 1
radai
  • 23,949
  • 10
  • 71
  • 115
  • i cannot do that because, if you have read my whole question you will find that the `ID` of the textboxes will again change with the new request. so if i open a new connection, the ID i retrieved earlier will be of no use – android_newbie Dec 30 '12 at 05:36
  • there's a difference between an http connection and an http session. you can open a new conenction that will map to the same session server side (where those ids are probbaly kept) – radai Dec 30 '12 at 07:15
  • you are not getting my point. the value of the `ID` changes even if I `REFRESH` the webpage in the same session. – android_newbie Dec 30 '12 at 10:55