0

我正在嘗試使用基於Worklight表單的身份驗證的本地Android項目。我已經能夠通過本地API對用戶進行身份驗證。當我在活動(意圖)之間切換時,會出現問題。一旦用戶輸入他的信息並提交表單,它就會被認證,但Worklight服務器連接丟失。 這是代碼:本機Android應用程序中基於Worklight表單的身份驗證

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); 


     } 
} 
+0

您是否從IBM Worklight入門嘗試了基於本機的基於表單的6.2身份驗證? – 2014-09-13 15:53:15

+0

對不起,我找不到那個項目... – 2014-09-13 15:57:16

+0

哦,我的壞...我們還沒有發佈它們。 :-)我會私下與你聯繫。 – 2014-09-13 16:16:46

回答

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"); 


     } 
     } 


} 
相關問題