传统网页实现用户登陆一般采用session或cookie记录用户基本信息又或者两者结合起来使用。android也可以采用session实现用户登陆验证并记录用户登陆状态时的基本信息,session是在服务器端的;而类似cookie的记录方式,则可以在客户端采用xml文件记录用户基本信息,重要数据则可以加密存放客户端。android实现的session登陆功能与网页请求不同的是,网页形式的一次成功的登陆请求后,再点击其他页面时,session一直是存在的,在一定时间内是有效的;而采用android客户端请求的一次成功登陆后,再次发送新的请求,则会产生新的session,而不是原来的。这就需要记录session的id号,并在整个请求过程中都记录并传递这个id号,才能保证session的一致性。
以获取php session为例,主要思路实现分为客户端与服务器端3个步骤。
附件:源码下载 1.)客户端(ANDROID) 建立一个名为GetWebSession的android项目,编写GetWebSession.java,LoginSuccessActivity.java,GetUserInfoActivity.java三个activity类。
GetWebSession.java主要是实现布局界面以及发送用户名和密码到php服务器端验证,如果验证成功则跳转到LoginSuccessActivity.java类。GetWebSession.java主要涉及到与服务器端连接请求,对从服务器端返回的json数据(如用户id,session等)进行解析,并存入HashMap,传递到LoginSuccessActivity.java 代码如下:
[view plain](http://www.yoyong.com/archives/178#)[copy to clipboard](http://www.yoyong.com/archives/178#)[print](http://www.yoyong.com/archives/178#)[?](http://www.yoyong.com/archives/178#) - <span class="keyword">package</span> com.login.main; - <span class="keyword">import</span> java.io.IOException; - <span class="keyword">import</span> java.io.UnsupportedEncodingException; - <span class="keyword">import</span> java.util.ArrayList; - <span class="keyword">import</span> java.util.HashMap; - <span class="keyword">import</span> java.util.List; - <span class="keyword">import</span> org.apache.http.HttpEntity; - <span class="keyword">import</span> org.apache.http.HttpResponse; - <span class="keyword">import</span> org.apache.http.client.ClientProtocolException; - <span class="keyword">import</span> org.apache.http.client.entity.UrlEncodedFormEntity; - <span class="keyword">import</span> org.apache.http.client.methods.HttpPost; - <span class="keyword">import</span> org.apache.http.impl.client.DefaultHttpClient; - <span class="keyword">import</span> org.apache.http.message.BasicNameValuePair; - <span class="keyword">import</span> org.apache.http.protocol.HTTP; - <span class="keyword">import</span> org.apache.http.util.EntityUtils; - <span class="keyword">import</span> org.json.JSONException; - <span class="keyword">import</span> org.json.JSONObject; - <span class="keyword">import</span> android.app.Activity; - <span class="keyword">import</span> android.content.Context; - <span class="keyword">import</span> android.content.Intent; - <span class="keyword">import</span> android.os.Bundle; - <span class="keyword">import</span> android.view.View; - <span class="keyword">import</span> android.view.View.OnClickListener; - <span class="keyword">import</span> android.widget.Button; - <span class="keyword">import</span> android.widget.EditText; - <span class="keyword">import</span> android.widget.Toast; - <span class="keyword">public</span> <span class="keyword">class</span> GetWebSession <span class="keyword">extends</span> Activity { - <span class="comment">/** Called when the activity is first created. */</span> - <span class="keyword">private</span> EditText user; - <span class="keyword">private</span> EditText password; - <span class="keyword">private</span> Button loginBtn; - <span class="keyword">private</span> Button logoutBtn; - <span class="comment">//主要是记录用户会话过程中的一些用户的基本信息</span> - <span class="keyword">private</span> HashMap<String, String> session =<span class="keyword">new</span> HashMap<String, String>(); - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) { - <span class="keyword">super</span>.onCreate(savedInstanceState); - setContentView(R.layout.main); - user=(EditText)findViewById(R.id.user); - password=(EditText)findViewById(R.id.password); - loginBtn=(Button)findViewById(R.id.loginBtn); - loginBtn.setOnClickListener(loginClick); - logoutBtn=(Button)findViewById(R.id.logoutBtn); - logoutBtn.setOnClickListener(logoutClick); - } - OnClickListener loginClick=<span class="keyword">new</span> OnClickListener() { - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View v) { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">if</span>(checkUser()){ - Toast.makeText(v.getContext(), <span class="string">“用户登录成功!”</span>, Toast.LENGTH_SHORT).show(); - Context context = v.getContext(); - Intent intent = <span class="keyword">new</span> Intent(context, - LoginSuccessActivity.<span class="keyword">class</span>); - <span class="comment">//传递session参数,在用户登录成功后为session初始化赋值,即传递HashMap的值</span> - Bundle map = <span class="keyword">new</span> Bundle(); - map.putSerializable(<span class="string">“sessionid”</span>, session); - intent.putExtra(<span class="string">“session”</span>, map); - context.startActivity(intent); <span class="comment">// 跳转到成功页面</span> - } - <span class="keyword">else</span> - Toast.makeText(v.getContext(), <span class="string">“用户验证失败!”</span>, Toast.LENGTH_SHORT).show(); - } - }; - OnClickListener logoutClick=<span class="keyword">new</span> OnClickListener() { - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View v) { - <span class="comment">// TODO Auto-generated method stub</span> - System.exit(<span class="number"></span>); - } - }; - <span class="keyword">private</span> <span class="keyword">boolean</span> checkUser(){ - String username=user.getText().toString(); - String pass=password.getText().toString(); - DefaultHttpClient mHttpClient = <span class="keyword">new</span> DefaultHttpClient(); - HttpPost mPost = <span class="keyword">new</span> HttpPost(<span class="string">“http://10.0.2.2/web/php/login.php”</span>); - <span class="comment">//传递用户名和密码相当于</span> - <span class="comment">//http://10.0.2.2/web/php/login.php?username=”&password=”</span> - List<BasicNameValuePair> pairs = <span class="keyword">new</span> ArrayList<BasicNameValuePair>(); - pairs.add(<span class="keyword">new</span> BasicNameValuePair(<span class="string">“username”</span>, username)); - pairs.add(<span class="keyword">new</span> BasicNameValuePair(<span class="string">“password”</span>, pass)); - <span class="keyword">try</span> { - mPost.setEntity(<span class="keyword">new</span> UrlEncodedFormEntity(pairs, HTTP.UTF_8)); - } <span class="keyword">catch</span> (UnsupportedEncodingException e) { - <span class="comment">// TODO Auto-generated catch block</span> - e.printStackTrace(); - } - <span class="keyword">try</span> { - HttpResponse response = mHttpClient.execute(mPost); - <span class="keyword">int</span> res = response.getStatusLine().getStatusCode(); - <span class="keyword">if</span> (res == <span class="number">200</span>) { - HttpEntity entity = response.getEntity(); - <span class="keyword">if</span> (entity != <span class="keyword">null</span>) { - String info = EntityUtils.toString(entity); - System.out.println(<span class="string">“info———–“</span>+info); - <span class="comment">//以下主要是对服务器端返回的数据进行解析</span> - JSONObject jsonObject=<span class="keyword">null</span>; - <span class="comment">//flag为登录成功与否的标记,从服务器端返回的数据</span> - String flag=<span class="string">“”</span>; - String name=<span class="string">“”</span>; - String userid=<span class="string">“”</span>; - String sessionid=<span class="string">“”</span>; - <span class="keyword">try</span> { - jsonObject = <span class="keyword">new</span> JSONObject(info); - flag = jsonObject.getString(<span class="string">“flag”</span>); - name = jsonObject.getString(<span class="string">“name”</span>); - userid = jsonObject.getString(<span class="string">“userid”</span>); - sessionid = jsonObject.getString(<span class="string">“sessionid”</span>); - } <span class="keyword">catch</span> (JSONException e) { - <span class="comment">// TODO Auto-generated catch block</span> - e.printStackTrace(); - } - <span class="comment">//根据服务器端返回的标记,判断服务端端验证是否成功</span> - <span class="keyword">if</span>(flag.equals(<span class="string">“success”</span>)){ - <span class="comment">//为session传递相应的值,用于在session过程中记录相关用户信息</span> - session.put(<span class="string">“s_userid”</span>, userid); - session.put(<span class="string">“s_username”</span>, name); - session.put(<span class="string">“s_sessionid”</span>, sessionid); - <span class="keyword">return</span> <span class="keyword">true</span>; - } - <span class="keyword">else</span>{ - <span class="keyword">return</span> <span class="keyword">false</span>; - } - } - <span class="keyword">else</span>{ - <span class="keyword">return</span> <span class="keyword">false</span>; - } - } - } <span class="keyword">catch</span> (ClientProtocolException e) { - <span class="comment">// TODO Auto-generated catch block</span> - e.printStackTrace(); - } <span class="keyword">catch</span> (IOException e) { - <span class="comment">// TODO Auto-generated catch block</span> - e.printStackTrace(); - } - <span class="keyword">return</span> <span class="keyword">false</span>; - } - } LoginSuccessActivity.java主要获取php的session唯一的标识id以及用户的一些基本信息,session id则作为本次用户登录状态在服务器的唯一标识,即确定用户的唯一状态进行相关操作。LoginSuccessActivity.java类的方法与GetWebSession.java类似。其主要功能是获取session id后再次发送session id到服务器进行验证,根据封装的session数据验证用户操作权限等。 代码如下:
...