当前位置: 代码迷 >> Web前端 >> android透过webservice验证用户
  详细解决方案

android透过webservice验证用户

热度:488   发布时间:2012-10-05 15:34:33.0
android通过webservice验证用户
在企业应用中,手机与企业数据的交互必不可少,在这里我们通过实例来描述android怎样调用.net webservice
第一步:vs2008建webservice ,贴出代码:



clsoptuser.cs

public class clsoptuser{  
//验证方法   
public bool Validate(string u, string p)       
{           
bool k = false;           
SqlConnection userConn = new SqlConnection("连接字符");            userConn.Open();           
SqlCommand userComm = new SqlCommand("select *from user", userConn);            SqlDataReader userDr = userComm.ExecuteReader();           
string tmpuser, tmppass;           
while (userDr.Read())           
{               
int userindex = userDr.GetOrdinal("user");               
int passindex = userDr.GetOrdinal("password");               
tmpuser = userDr.GetString(userindex);               
tmppass = userDr.GetString(passindex);        
//用户名和口令正确返回true               
if ((tmpuser == u) && (tmppass == p))               
{                   
k = true;                   
break;               
}           
}           
return k;       
}
}

Service.cs
    [WebMethod]   
public bool ValidateUsername(string username, string pass, string validate)   
{       
if (validate == "webservice验证码")       
{           
clsoptuser objoptuser = new clsoptuser();           
return objoptuser.Validate(username, pass);                       
}       
else       
{                       
return false;       
}   
}

以上是服务器端的代码,把上面程序布署到IIS,布署以后可以用IE测试,具体布署我就不说了,网上到处有!

第二步:android客户端

android调用webservice 要用到ksoap2-android-assembly-2.4-jar-with-dependencies.jar一个包,到网上可下载,然后在Eclipce项目中添加处部jar

  1、布局文件



main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"     android:background="@drawable/login2"     android:gravity="bottom"><LinearLayout android:id="@+id/LinearLayout02"                 android:layout_height="wrap_content"                 android:layout_width="fill_parent">                <TextView android:layout_width="wrap_content"                             android:layout_height="wrap_content"                             android:id="@+id/labeluser"                             android:text="@string/labelname"                             android:textStyle="bold"                             android:textSize="20sp">                </TextView>                <EditText android:layout_height="wrap_content"                             android:id="@+id/EditTextUser"                             android:width="150px"                             android:layout_width="fill_parent">                </EditText></LinearLayout><LinearLayout android:id="@+id/LinearLayout03"               android:layout_height="wrap_content"               android:layout_width="fill_parent">              <TextView android:layout_width="wrap_content"                           android:layout_height="wrap_content"                           android:id="@+id/labelpass"                           android:text="登录密码:"                           android:textStyle="bold"                           android:textSize="20sp">              </TextView>              <EditText android:layout_height="wrap_content"                           android:id="@+id/EditTextPassWord"                           android:password="true"                          android:layout_width="fill_parent">              </EditText></LinearLayout><LinearLayout android:id="@+id/LinearLayout04"   android:layout_height="wrap_content"   android:layout_width="fill_parent"   android:gravity="center">   <CheckBox android:id="@+id/CheckBox01"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="记住用户名和密码"     android:checked="true">  </CheckBox></LinearLayout><LinearLayout android:id="@+id/LinearLayout01"     android:layout_height="wrap_content"     android:layout_width="fill_parent"     android:layout_gravity="bottom"     android:gravity="center">    <Button android:id="@+id/BtnLogin"         android:text="登 录"         android:layout_height="wrap_content"         android:layout_width="wrap_content"         android:layout_weight="1">    </Button>    <Button android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:id="@+id/BtnExit"         android:text="退 出"        android:layout_weight="1">    </Button></LinearLayout></LinearLayout>想到每次进系统都要输入用户名和密码都恐怖(android的虚拟键盘确实不怎的),所以上面加了个"记住用户名和密码",方便下次不用输用户名和密码.

2、login.java

login.java
package com.liwei.login;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import com.liwei.prohotel.clswdy.HttpThread;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;import android.os.Handler;
import android.os.Message;import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class login extends Activity {   
Button btnlogin,btnexit; //登录和退出按钮对像   
EditText edituser,editpass; //用户名和密码输入框对象   
boolean data=false; //调用webservice 近回的数据,验证成功true,失败false    HttpThread thread=null; //线程对像   
String name=""; //用户名   
String pass=""; //口令   
/** Called when the activity is first created. */  
@Override   
public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);       
setContentView(R.layout.main);       
btnlogin=(Button)findViewById(R.id.BtnLogin); //获得用户名和密码按钮实例        btnexit=(Button)findViewById(R.id.BtnExit);       
edituser=(EditText)findViewById(R.id.EditTextUser); //获得用户名和密码Edittext        editpass=(EditText)findViewById(R.id.EditTextPassWord);    
//获取上次保存的用户名和密码       
SharedPreferences sp=getSharedPreferences("login",Context.MODE_PRIVATE);        String tempstr=sp.getString("username", "");       
edituser.setText(tempstr);       
editpass.setText(sp.getString("pass", ""));     
//退出按钮点击事件       
btnexit.setOnClickListener(new View.OnClickListener()
{                       
public void onClick(View arg0) {               
// TODO Auto-generated method stub               
finish();                           
}       
}
);       
//登录按钮点击事件       
btnlogin.setOnClickListener(new View.OnClickListener()
{                       
public void onClick(View arg0)
{               
// TODO Auto-generated method stub                                name=edituser.getText().toString();                pass=editpass.getText().toString();                                ResponseOnClickLogin(name, pass);                           
}       
}
);   
}   
public  void  ResponseOnClickLogin(String username,String password)
{       
thread=new HttpThread(handlerwdy);
//建立线程实例              
HashMap <String ,Object> params=new HashMap<String ,Object>();       
try{        
String strvalidate="galyglxxxt";          
strvalidate=new String(strvalidate.toString().getBytes(),"UTF-8");           params.put("username", username);//加入参数           
params.put("pass", password);         
params.put("validate", strvalidate);       
}catch(Exception ex){               
ex.printStackTrace();       
}       
String url="192.168.3.2:8080/loginweb/service.asmx";//webserivce地址     
String nameSpace = "http://tempuri.org/";   //空间名,可修改     
String methodName = "ValidateUsername";   //需调用webservice名称      thread.doStart(url, nameSpace, methodName, params);   //启动线程          
}  
//生成消息对象   
Handler handlerwdy=new Handler(){              
public void handleMessage(Message m){           
switch(m.what){           
case 1:             
data=m.getData().getBoolean("data"); //从消息在拿出数据             
if(data){                   
CheckBox cb=(CheckBox)findViewById(R.id.CheckBox01);
//如果要保存用户名和密码                   
if(cb.isChecked())                   
{                           
SharedPreferences sp=getSharedPreferences("login",Context.MODE_PRIVATE);                        Editor editor=sp.edit();                       
String tempname=name;                       
editor.putString("username", name);                        editor.putString("pass", pass);                       
editor.commit();                   
}                   
else                   
{                      
SharedPreferences sp=getSharedPreferences("login",Context.MODE_PRIVATE);                        Editor editor=sp.edit();                       
editor.putString("username", "");                       
editor.putString("pass", "");                       
editor.commit();                   
}           
//登录成功后的提示                                      Toast.makeText(prohotel.this, getString(R.string.login_message), Toast.LENGTH_SHORT).show();            
//成功后界面要交给项目的主界面了                   
Intent in=new Intent(prohotel.this,promain.class);                  
//把用户名传给下一个activity                    
Bundle bundle = new Bundle();                       bundle.putString("KEY_USERNAME",name);                      
in.putExtras(bundle);                      
login.this.startActivity(in);                                 
}             
else             
{          
//验证不通过,给出个提示                
SharedPreferences sp=getSharedPreferences("login",Context.MODE_PRIVATE);                    Editor editor=sp.edit();                   
editor.putString("username", "");                   
editor.putString("pass", "");                   
editor.commit();                 
new AlertDialog.Builder(prohotel.this)                    .setTitle(getString(R.string.login_message_title))                     .setMessage(getString(R.string.login_message_title))                     .setIcon(R.drawable.cancel)                    .setNeutralButton(getString(R.string.login_button_text), new DialogInterface.OnClickListener() {                      
public void onClick(DialogInterface dlg, int sumthin) {                        
// do nothing ?C it will close on its own                      
}                    
}).show();             
}                     
break;                
case 2:         
//收到了调用出错的消息                     
new AlertDialog.Builder(prohotel.this)
.setTitle("出错:")                  
.setMessage(m.getData().getString("error"))                   .setNeutralButton("Close", new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dlg, int sumthin) {                      
// do nothing ?C it will close on its own                    
}                  
}).show();               
break;                          
}           
}   
};
//线程类
public class HttpThread extends Thread{   
private Handler handle=null;   
String url=null;   
String nameSpace=null;   
String methodName=null;   
HashMap <String ,Object> params=null;   
ProgressDialog progressDialog=null;       
public HttpThread(Handler hander)
{           
handle=hander;   
}   
//线程开始   
public void doStart(String url, String nameSpace, String methodName,                         HashMap<String, Object> params)
{                
// 把参数传进来           
this.url=url;           
this.nameSpace=nameSpace;           
this.methodName=methodName;           
this.params=params;           
//告诉使用者,请求开始了           
progressDialog=new ProgressDialog(prohotel.this);            progressDialog.setTitle("网络连接");           
progressDialog.setMessage("正在请求,请稍等......");            progressDialog.setIndeterminate(true);            //progressDialog=ProgressDialog.show(clswdy.this, "网络连接","正在验证,请稍等......",true,true);           
progressDialog.setButton("取消", new DialogInterface.OnClickListener() {                public void onClick(DialogInterface dialog, int i) {                 progressDialog.cancel();                                
}              
});          
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {                public void onCancel(DialogInterface dialog) {              
}              
});          
progressDialog.show();           
this.start(); //线程开始了       
}   
/**     */
@Override
public void run() {        
// TODO Auto-generated method stub    
super.run();    
try{            
//web service请求,result为返回结果            
boolean result= CallWebService();            
if(result){                    
//取消进度对话框                    
progressDialog.dismiss();                     //clswdy.this.setProgressBarIndeterminateVisibility(false);                  
//构造消息,验证通过了                    
Message message=handle.obtainMessage();                    
Bundle b=new Bundle();                    
message.what=1; //这里是消息的类型                    
b.putBoolean("data", true); //这里是消息传送的数据                                          message.setData(b);                    
handle.sendMessage(message);            
}            
else            
{               
progressDialog.dismiss();               
Message message=handle.obtainMessage();               
Bundle b=new Bundle();               
message.what=1;               
b.putBoolean("data", false);               
message.setData(b);               
handle.sendMessage(message);                             
}    
}catch(Exception ex){       
progressDialog.dismiss();       
// 构造消息,程序出错了        
Message message=handle.obtainMessage();        
Bundle b=new Bundle();       
message.what=2;         
b.putString("error", ex.getMessage());       
message.setData(b);       
handle.sendMessage(message);                          
}finally{                 
} }
/**  *   */
protected boolean CallWebService() throws Exception{        
String SOAP_ACTION = nameSpace + methodName;        
boolean response=false;       
SoapObject request=new SoapObject(nameSpace,methodName);      
// boolean request=false;        
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);                  envelope.dotNet=true; //.net 支持                
// 参数            
if(params != null && !params.isEmpty() ){                
for(Iterator it=params.entrySet().iterator();it.hasNext();){                         Map.Entry e=(Entry) it.next();                         request.addProperty(e.getKey().toString(),e.getValue());                                        }        
}        
envelope.bodyOut=request;       
//        
AndroidHttpTransport androidHttpTrandsport=new AndroidHttpTransport(url);       
//HttpTransportSE androidHttpTransport = new HttpTransportSE(url);         SoapObject result=null;        
try{               
//web service请求            
androidHttpTrandsport.call(SOAP_ACTION, envelope);                
//得到返回结果          
Object  temp=envelope.getResult();           response=Boolean.parseBoolean(temp.toString());       
}catch(Exception ex){                
throw ex;        
}        
return response;         
}
}
}以上验证程序需要访问网络,别忘了在AndroidManifest.xml加入
<uses-permission android:name="android.permission.INTERNET" />
1 楼 msn877763580 2012-02-22  
朋友。。。看的晕了彻底
2 楼 foxer 2012-04-13  
没法看,发布的时候怎么没用code格式一下呀.院 
  相关解决方案