Native Android应用程序中基于Worklight表单的身份验证

时间:2014-09-13 15:46:42

标签: android android-intent ibm-mobilefirst worklight-security

我正在尝试使用基于Worklight表单的身份验证的本机android项目。我已经能够通过本机API对用户进行身份验证。当我在活动(意图)之间切换时会出现问题。用户输入其信息并提交表单后,将对其进行身份验证,但工作灯服务器连接将丢失。 这是代码:

MainActivity.java

public class MainActivity extends Activity {
    private Button buttonConnect = null;
    private Button buttonInvoke = null;
    private static TextView textView = null;
    private static MainActivity _this;
    private MyChallengeHadler challengeHandler;


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

        buttonConnect = (Button)findViewById(R.id.buttonConnect);
        buttonInvoke = (Button)findViewById(R.id.buttonInvoke);
        textView = (TextView)findViewById(R.id.textView);

        final WLClient client = WLClient.createInstance(this);

        buttonConnect.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                updateTextView("Connecting...");
                client.connect(new MyConnectListener());
                challengeHandler = new MyChallengeHadler(MainActivity.this, "BasicAuth");
                client.registerChallengeHandler(challengeHandler);

            }
        });

        buttonInvoke.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                updateTextView("Invoking procedure...");

                String adapterName = "RSSReader";
                String procedureName = "getStoriesFiltered";

                WLProcedureInvocationData invocationData = 
                        new WLProcedureInvocationData(adapterName, procedureName);

                Object[] parameters = new Object[] {"world"};
                invocationData.setParameters(parameters);

                WLRequestOptions options = new WLRequestOptions();
                options.setTimeout(30000);

                WLClient client = WLClient.getInstance();
                client.invokeProcedure(invocationData, new MyInvokeListener(), options);
            }
        });
    }

    public static void updateTextView(final String str){
        Runnable run = new Runnable() {         
            public void run() {
                textView.setText(str);              
            }
        };
        _this.runOnUiThread(run);
    }

}

LoginActivity.java

public class LoginActivity extends Activity {

    private Button Submit = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Submit = (Button)findViewById(R.id.button1);

         Submit.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    MyChallengeHadler challengeHandler = new MyChallengeHadler(LoginActivity.this, "BasicAuth");
                    challengeHandler.submitLogin(0, "maria", "maria", false);
                }
            });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.login, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

MyChallengeHadler.java

public class MyChallengeHadler extends ChallengeHandler {

    private WLResponse cachedResponse;
    private final Activity parentActivity;

    public MyChallengeHadler(final Activity a, String realm) {

        super(realm);
        this.parentActivity =a;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onFailure(WLFailResponse arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSuccess(WLResponse arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isCustomResponse(WLResponse response) {
        if (response == null || response.getResponseText() == null
                || response.getResponseText().indexOf("j_security_check") == -1) {
            return false;
        }
        return true;
    }

    @Override
    public void handleChallenge(WLResponse response){
        if (!isCustomResponse(response)) {
        submitSuccess(response);
        } else {
        cachedResponse = response;
        Intent login = new Intent(parentActivity, LoginActivity.class);

        parentActivity.startActivityForResult(login, 1);

        }
        }

    public void submitLogin(int resultCode, String userName, String password, boolean back){

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("j_username", userName);
        params.put("j_password", password);
        submitLoginForm("/j_security_check", params, null, 0, "post");
        Intent login = new Intent(parentActivity, MainActivity.class);
        parentActivity.startActivityForResult(login, 1);


        }
}

1 个答案:

答案 0 :(得分:0)

我已经解决了我的代码问题。我错误地使用了android的意图。这是代码的新版本:

<强> LoginActivity.java

public class LoginActivity extends Activity {

    private Button Submit;
    private Intent result;

    public static final String Back = "back";
    public static final String UserNameExtra = "username";
    public static final String PasswordExtra = "password";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Submit = (Button)findViewById(R.id.button1);
        result = new Intent();
         Submit.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    result.putExtra(UserNameExtra, "maria");
                    result.putExtra(PasswordExtra, "maria");
                    result.putExtra(Back, false);
                    setResult(RESULT_OK, result);
                    finish();
                }
            });

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.login, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

<强> MainActivity.java

public class MainActivity extends Activity {
    private Button buttonConnect = null;
    private Button buttonInvoke = null;
    private static TextView textView = null;
    private static MainActivity _this;
    private MyChallengeHadler challengeHandler;
    private String realm = "BasicAuth";

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

        buttonConnect = (Button)findViewById(R.id.buttonConnect);
        buttonInvoke = (Button)findViewById(R.id.buttonInvoke);
        textView = (TextView)findViewById(R.id.textView);

        final WLClient client = WLClient.createInstance(this);

        buttonConnect.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                updateTextView("Connecting...");
                client.connect(new MyConnectListener());
                challengeHandler = new MyChallengeHadler(MainActivity.this, realm);
                client.registerChallengeHandler(challengeHandler);

            }
        });

        buttonInvoke.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                updateTextView("Invoking procedure...");

                String adapterName = "SOAPAdapter";
                String procedureName = "getStories";

                WLProcedureInvocationData invocationData = 
                        new WLProcedureInvocationData(adapterName, procedureName);

                //Object[] parameters = new Object[] {"world"};
                //invocationData.setParameters(parameters);

                WLRequestOptions options = new WLRequestOptions();
                options.setTimeout(30000);

                WLClient client = WLClient.getInstance();
                client.invokeProcedure(invocationData, new MyResponseListener(), options);
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        boolean back = data.getBooleanExtra(LoginActivity.Back, true);
        String username = data.getStringExtra(LoginActivity.UserNameExtra);
        String password = data.getStringExtra(LoginActivity.PasswordExtra);
        challengeHandler.submitLogin(resultCode, username, password, back);
    }

    public static void updateTextView(final String str){
        Runnable run = new Runnable() {         
            public void run() {
                textView.setText(str);              
            }
        };
        _this.runOnUiThread(run);
    }

}

<强> MyChallengeHadler.java

public class MyChallengeHadler extends ChallengeHandler {

    private WLResponse cachedResponse;
    private final Activity parentActivity;

    public MyChallengeHadler(final Activity a, String realm) {

        super(realm);
        parentActivity =a;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onFailure(WLFailResponse arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSuccess(WLResponse arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isCustomResponse(WLResponse response) {
        if (response == null || response.getResponseText() == null
                || response.getResponseText().indexOf("j_security_check") == -1) {
            return false;
        }
        return true;
    }

    @Override
    public void handleChallenge(WLResponse response){
        if (!isCustomResponse(response)) {
        submitSuccess(response);
        } else {
        cachedResponse = response;
        Intent login = new Intent(parentActivity, LoginActivity.class);
        parentActivity.startActivityForResult(login, 1);

        }
        }

    public void submitLogin(int resultCode, String userName, String password, boolean back){
        if (resultCode != Activity.RESULT_OK || back) {
        submitFailure(cachedResponse);
        } else {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("j_username", userName);
        params.put("j_password", password);
        submitLoginForm("/j_security_check", params, null, 0, "post");


        }
        }


}