简体   繁体   中英

Logging into a website using Android app (Java)

I am currently trying to make an app that would allow you to log into your account and view whatever data needs to be displayed.

I am not using webview but instead, for displaying information I will be parsing data from HTML and then working from there, extracting data that I need to display. I will post code from my app below.

What I need help with is figuring out how to log into the website with my app.

Basically, steps would look like that:

1.Enter Username

2.Enter Password

3.Press Login Button

4.Send Username&Password to the website

5.If - website returns "Successful login", proceed and parse next page from HTML, Else - display "Wrong username or password"

However, I have no idea how to make my app log in, or at least input data in the website's login fields so that I can at least get a response in some way.

I am very new to this, so please, at least point me in the right direction so that I can figure it out. Thank you very much.

    package com.example.app;

    import androidx.appcompat.app.AppCompatActivity;

    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;

    public class MainActivity extends AppCompatActivity {
        String data;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            TextView LoginTitle = findViewById(R.id.tvLoginTitle);
            EditText Username = findViewById(R.id.etUsername);
            EditText Password = findViewById(R.id.etPass);
            Button Login = findViewById(R.id.btLogin);

            Login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Parse().execute();
                    Intent intent = new Intent(MainActivity.this,UserAccount.class);
                    intent.putExtra("data",data);
                    startActivity(intent);
                }
            });

        }

        public class Parse extends AsyncTask<Void, Void, Void> {
            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    Document WebPage = Jsoup.connect("https://myurl").get();
                    Log.d("data", WebPage.toString());
                    data=WebPage.toString();
                } catch(Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //Used in guide, however, my implementation of the app doesn't seem to need this.
        }
    }
}

I am not sure what you are trying to do by logging the content of the WebPage there. What you need to do first is check if the "browser" has Javascript enabled but in your case this is moot because you are using your own WebView. It would still be wise to just check if JS is enabled.

The next step obviously involves using JS since I asked you to check if it is enabled. Here is the code but note I did nor test this but it is a step in the right direction:

    public void loginUser(View view) {

        InputMethodManager inputMan = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(layout.getWindowToken(), 0);


        webView.loadUrl("https://yourwebsite.net");
        webView.setVisibility(View.INVISIBLE);
        webView.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String url) {
                webView.loadUrl("javascript: {" + "document.getElementById('login_account').value = '" + "USERNAME" + "';" + "document.getElementById('login_password').value = '" + "PASSWORD" + "';" + "document.getElementById('submit').click();" + "};");
                 }

            public void onPageFinished2(WebView view, String url) {
                webView.loadUrl(url);
            }
        });

        webView.clearCache(true);
        webView.clearHistory();


    WebView webView2 = (WebView) this.findViewById(R.id.web_view);

    String url = "https://yourwebsite.net";
    webView2.loadUrl(url);

}

Some points to note: change the values login_account and login_password to something that a person cannot easily guess for security.

Here is the solution to this:

class HTTPRequest implements Runnable {

    private URL url;
    private User user;
    private Handler handler;
    private String cookie;

    //**REDEFINED CONSTRUCTOR
    HTTPRequest(Handler in_handler, User in_user) {
        try {
                        url = new URL("https://yoururl.com");

            handler = in_handler;
            user = in_user;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            //**Preparing to open connection
            //**Using POST method
            //**Enabling Input & Output
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            //**Setting Headers to send with POST request
            conn.setRequestProperty("Accept", "text/html");
            conn.setRequestProperty("Accept", "text/xml");
            conn.setRequestProperty("Cookie", "upassword=" + user.getPasswordHashed() + "; ulogin=" + user.getUsername());
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("charset", "UTF-8");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0");

            //**READING RESPONSE FROM THE SERVER:
            //**IF LOGIN WAS SUCCESSFUL, SEND MESSAGE WITH XML DATA BACK TO UI THREAD, ELSE SEND NULL TO UI THREAD
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            if (isLoginSuccess(input)) {
                StringBuilder response = new StringBuilder();
                String tempString;
                while ((tempString = input.readLine()) != null) {
                    response.append(tempString);
                }
                input.close();
                conn.disconnect();

                Message msg = Message.obtain();
                msg.obj = response.toString();
                handler.sendMessage(msg);
            } else if (!isLoginSuccess(input)) {
                input.close();
                conn.disconnect();
                Message msg = Message.obtain();
                msg.obj = "Wrong";
                handler.sendMessage(msg);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //**LOGIN IS SUCCESSFUL WHEN THE RESPONSE'S FIRST LINE EQUALS XML DECLARATION
    //**RETURNS TRUE IF THAT IS THE CASE, MEANING YOU HAVE SUCCESSFULLY LOGGED IN
    private boolean isLoginSuccess(BufferedReader input) throws IOException {
        String LoginSuccess = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

        String response = input.readLine();
        return response.equals(LoginSuccess);
    }
}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    public static final String EXTRA_MESSAGE = "Message 1";
    public static final String EXTRA_MESSAGE_2 = "Message 2";
    Handler mainHandler;
    Thread thread;
    User user;

    EditText etUsername;
    EditText etPassword;
    CheckBox cbRememberMe;
    Button btLogin;

    SharedPreferences preferences;
    SharedPreferences.Editor SPEditor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.LoginPageTheme);
        setContentView(R.layout.activity_main);

        //**DECLARATION OF SHARED PREFERENCES
        preferences = getApplicationContext().getSharedPreferences("Preferences", MODE_PRIVATE);
        SPEditor = preferences.edit();
        SPEditor.apply();

        //**HANDLER INSTANTIATING AND HANDLING MESSAGES FROM HTTPRequest
        mainHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                String message = msg.obj.toString();
                thread.interrupt();
                if (!message.equals("Wrong")) {
                    if (cbRememberMe.isChecked()) {
                        user.RememberLoginSuccess(preferences);
                    }
                    Intent intent = new Intent(getApplicationContext(), ProfilePageActivity.class);
                    intent.putExtra(EXTRA_MESSAGE, message);
                    intent.putExtra(EXTRA_MESSAGE_2, user);
                    startActivity(intent);
                    finish();
                } else {
                    etUsername.setError("Wrong username or password");
                    etUsername.setText("");
                    etPassword.setText("");
                }
            }
        };

        etUsername = findViewById(R.id.et_username);
        etPassword = findViewById(R.id.et_password);
        cbRememberMe = findViewById(R.id.cb_rememberMe);
        btLogin = findViewById(R.id.bt_login);

        btLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String temp_user = etUsername.getText().toString();
                String temp_pass = etPassword.getText().toString();
                if (!TextUtils.isEmpty(temp_user) && !TextUtils.isEmpty(temp_pass)) {
                    user = new User(etUsername.getText().toString(), etPassword.getText().toString());
                    thread = new Thread(new HTTPRequest(mainHandler, user));
                    thread.start();
                } else {
                    etUsername.setError("Please, fill-out the form");
                    etUsername.setText("");
                    etPassword.setText("");
                }
            }
        });
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM