传统网页实现用户登陆一般采用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
代码如下:
- <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数据验证用户操作权限等。
代码如下:
- <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.TextView;
- <span class="keyword">import</span> android.widget.Toast;
- <span class="keyword">public</span> <span class="keyword">class</span> LoginSuccessActivity <span class="keyword">extends</span> Activity{
- <span class="keyword">private</span> HashMap<String, String>session;
- <span class="annotation">@SuppressWarnings</span>(<span class="string">“unchecked”</span>)
- <span class="annotation">@Override</span>
- <span class="keyword">protected</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) {
- <span class="comment">// TODO Auto-generated method stub</span>
- <span class="keyword">super</span>.onCreate(savedInstanceState);
- setContentView(R.layout.login_success);
- <span class="comment">//获取从登录成功后界面的传递的参数</span>
- session = (HashMap<String, String>) <span class="keyword">this</span>.getIntent()
- .getBundleExtra(<span class="string">“session”</span>).getSerializable(<span class="string">“sessionid”</span>);
- <span class="comment">//读取session的基本信息,并显示相应的控件</span>
- String userid_info=session.get(<span class="string">“s_userid”</span>);
- String username_info=session.get(<span class="string">“s_username”</span>);
- String session_id=session.get(<span class="string">“s_sessionid”</span>);
- <span class="comment">//显示相应的内容到控件</span>
- TextView userid_show=(TextView)findViewById(R.id.userid_show);
- userid_show.setText(userid_info);
- TextView username_show=(TextView)findViewById(R.id.username_show);
- username_show.setText(username_info);
- TextView sessionid_show=(TextView)findViewById(R.id.sessionid_show);
- sessionid_show.setText(session_id);
- <span class="comment">//根据本次session再次获取用户信息</span>
- Button getInfo=(Button)findViewById(R.id.getinfo);
- getInfo.setOnClickListener(getInfoClick);
- }
- OnClickListener getInfoClick=<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>(getUserInfo()){
- Context context = v.getContext();
- Intent intent = <span class="keyword">new</span> Intent(context,
- GetUserInfoActivity.<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();
- }
- }
- };
- <span class="keyword">private</span> <span class="keyword">boolean</span> getUserInfo(){
- String sess_username=session.get(<span class="string">“s_username”</span>);
- String sess_userid=session.get(<span class="string">“s_userid”</span>);
- String sess_id=session.get(<span class="string">“s_sessionid”</span>);
- 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/getinfo.php”</span>);
- List<BasicNameValuePair> pairs = <span class="keyword">new</span> ArrayList<BasicNameValuePair>();
- pairs.add(<span class="keyword">new</span> BasicNameValuePair(<span class="string">“sess_userid”</span>, sess_userid));
- pairs.add(<span class="keyword">new</span> BasicNameValuePair(<span class="string">“sess_username”</span>, sess_username));
- pairs.add(<span class="keyword">new</span> BasicNameValuePair(<span class="string">“sess_sessionid”</span>, sess_id));
- <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 userinfo=<span class="string">“”</span>;
- String level=<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>);
- userinfo = jsonObject.getString(<span class="string">“info”</span>);
- level = jsonObject.getString(<span class="string">“level”</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">“notempty”</span>)){
- <span class="comment">//为session传递相应的值,用于在session过程中记录相关用户信息</span>
- session.put(<span class="string">“info_userinfo”</span>, userinfo);
- session.put(<span class="string">“info_level”</span>, level);
- session.put(<span class="string">“info_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>;
- }
- }
3.GetUserInfoActivity.java类是根据用户登录后产生唯一session 标识进行操作获取用户详细信息的类。
代码如下:
- <span class="keyword">package</span> com.login.main;
- <span class="keyword">import</span> java.util.HashMap;
- <span class="keyword">import</span> android.app.Activity;
- <span class="keyword">import</span> android.os.Bundle;
- <span class="keyword">import</span> android.widget.TextView;
- <span class="keyword">public</span> <span class="keyword">class</span> GetUserInfoActivity <span class="keyword">extends</span> Activity{
- <span class="keyword">private</span> HashMap<String, String>session;
- <span class="annotation">@SuppressWarnings</span>(<span class="string">“unchecked”</span>)
- <span class="annotation">@Override</span>
- <span class="keyword">protected</span> <span class="keyword">void</span> onCreate(Bundle savedInstanceState) {
- <span class="comment">// TODO Auto-generated method stub</span>
- <span class="keyword">super</span>.onCreate(savedInstanceState);
- setContentView(R.layout.get_info);
- <span class="comment">//获取从登录成功后界面的再次传递的参数</span>
- session = (HashMap<String, String>) <span class="keyword">this</span>.getIntent().
- getBundleExtra(<span class="string">“session”</span>).getSerializable(<span class="string">“sessionid”</span>);
- <span class="comment">//读取session的基本信息,并显示相应的控件</span>
- String session_info=session.get(<span class="string">“info_userinfo”</span>);
- String session_level=session.get(<span class="string">“info_level”</span>);
- String session_id=session.get(<span class="string">“info_sessionid”</span>);
- <span class="comment">//显示相应的内容到控件</span>
- System.out.println(<span class="string">“session_info——–“</span>+session_info);
- TextView get_info=(TextView)findViewById(R.id.get_info);
- get_info.setText(session_info);
- TextView get_level=(TextView)findViewById(R.id.get_level);
- get_level.setText(session_level);
- TextView get_sessionid=(TextView)findViewById(R.id.get_sessionid);
- get_sessionid.setText(session_id);
- }
- }
4.三个布局的xml文件
(1.)main.xml
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">“1.0”</span> <span class="attribute">encoding</span>=<span class="attribute-value">“utf-8”</span><span class="tag">?></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">“http://schemas.android.com/apk/res/android”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“vertical”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span> <span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“用户”</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">EditText</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span> <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:singleLine</span>=<span class="attribute-value">“true”</span> <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/user”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">EditText</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“密码”</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">EditText</span> <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/password”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span> <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:password</span>=<span class="attribute-value">“true”</span> <span class="attribute">android:singleLine</span>=<span class="attribute-value">“true”</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">EditText</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
-
- <span class="tag"><</span><span class="tag-name">TableRow</span> <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">Button</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span> <span class="attribute">android:text</span>=<span class="attribute-value">“登录”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/loginBtn”</span>
- <span class="attribute">android:layout_weight</span>=<span class="attribute-value">“1”</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">Button</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">Button</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“退出”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/logoutBtn”</span>
- <span class="attribute">android:layout_weight</span>=<span class="attribute-value">“1”</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">Button</span><span class="tag">></span>
-
- <span class="tag"></</span><span class="tag-name">TableRow</span><span class="tag">></span> <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span> <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
(2.)login_success.xml
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">“1.0”</span> <span class="attribute">encoding</span>=<span class="attribute-value">“utf-8”</span><span class="tag">?></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">“http://schemas.android.com/apk/res/android”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“vertical”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“用户ID:”</span> <span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/userid_show”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“用户名: “</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/username_show”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“本次会话:”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/sessionid_show”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">Button</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/getinfo”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“根据本次会话再次获取用户信息”</span>
- <span class="tag">></span><span class="tag"></</span><span class="tag-name">Button</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
(3.)get_info.xml
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">“1.0”</span> <span class="attribute">encoding</span>=<span class="attribute-value">“utf-8”</span><span class="tag">?></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">“http://schemas.android.com/apk/res/android”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“vertical”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“用户信息: “</span> <span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/get_info”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“用户级别:”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/get_level”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
-
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:text</span>=<span class="attribute-value">“本次会话:”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">TextView</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span> <span class="attribute">android:text</span>=<span class="attribute-value">“”</span>
- <span class="attribute">android:id</span>=<span class="attribute-value">“@+id/get_sessionid”</span> <span class="tag">></span><span class="tag"></</span><span class="tag-name">TextView</span><span class="tag">></span>
- <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
- <span class="tag"><</span><span class="tag-name">LinearLayout</span> <span class="attribute">android:layout_height</span>=<span class="attribute-value">“wrap_content”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:orientation</span>=<span class="attribute-value">“horizontal”</span>
- <span class="attribute">android:paddingLeft</span>=<span class="attribute-value">“0dip”</span><span class="tag">></span> <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span> <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span>
2.)服务器端(PHP)
php服务器端主要有三个文件,conn.php,login.php和getinfo.php。
conn.php是连接数据库的配置文件。
login.php主要是用来验证android客户端发送的请求,请求成功则返回flag=’success’的状态标识,采用数组记录用户基本信息,存储用户数据到session,并且记录本次产生的session id。用户基本数据及本次session产生的id均封装成json格式(json_encode(arr)),发送android客户端。产生本次session id的方法sessionid=session_id();//注意没有参数
具体代码如下:
- <?php
- header(<span class="string">“Content-Type: text/html; charset=utf-8”</span>) ;
- <span class="comment">//包含数据库连接文件</span>
- <span class="keyword">include</span>(<span class="string">‘conn.php’</span>);
- session_start();
- <span class="vars">$username</span> = htmlspecialchars(<span class="vars">$_POST</span>[<span class="string">“username”</span>]);
- <span class="vars">$password</span>=<span class="vars">$_POST</span>[<span class="string">“password”</span>];
- mysql_query(<span class="string">“set names utf8”</span>);
- <span class="comment">//检测用户名及密码是否正确</span>
- <span class="vars">$check_query</span> = mysql_query(<span class="string">“select id ,name from user where name=’$username’ and</span>
- <span class="string">password=’$password’ limit 1″</span>);
- <span class="vars">$arr</span>=<span class="keyword">array</span>();<span class="comment">//空的数组,该数组主要是格式化数据并封装成json格式发送到客户端</span>
- <span class="keyword">if</span>(<span class="vars">$result</span> = mysql_fetch_array(<span class="vars">$check_query</span>)){
- <span class="comment">//登录成功</span>
- <span class="vars">$_SESSION</span>[<span class="string">‘username’</span>] = <span class="vars">$result</span>[<span class="string">‘name’</span>];
- <span class="vars">$_SESSION</span>[<span class="string">‘userid’</span>] = <span class="vars">$result</span>[<span class="string">‘id’</span>];
- <span class="comment">//获取当前session id</span>
- <span class="vars">$sessionid</span>=session_id();
- <span class="vars">$_SESSION</span>[<span class="string">‘$sessionid’</span>] = <span class="vars">$sessionid</span>;
- <span class="vars">$arr</span> = <span class="keyword">array</span>(
- <span class="string">‘flag’</span>=><span class="string">‘success’</span>,
- <span class="string">‘name’</span>=><span class="vars">$result</span>[<span class="string">‘name’</span>],
- <span class="string">‘userid’</span>=><span class="vars">$result</span>[<span class="string">‘id’</span>],
- <span class="string">‘sessionid’</span>=><span class="vars">$sessionid</span>
- );
- <span class="comment">//封装json,如果php版本低于5.2,则不支持json_encode()方法,</span>
- <span class="comment">//可以参考本文件夹中php_json_encode.php中php_json_encode()方法代替json_encode();</span>
- <span class="func">echo</span> json_encode(<span class="vars">$arr</span>);
- } <span class="keyword">else</span> {
- <span class="vars">$arr</span> = <span class="keyword">array</span>(
- <span class="string">‘flag’</span>=><span class="string">‘error’</span>,
- <span class="string">‘name’</span>=><span class="string">”</span>,
- <span class="string">‘userid’</span>=><span class="string">”</span>,
- <span class="string">‘sessionid’</span>=><span class="string">”</span>
- ); <span class="comment">//封装json,如果php版本低于5.2,则不支持json_encode()方法,</span>
- <span class="comment">//可以参考本文件夹中php_json_encode.php中php_json_encode()方法代替json_encode();</span>
- <span class="func">echo</span> json_encode(<span class="vars">$arr</span>);
- }
- ?>
- getinfo.php文件主要是用户再次查询信息验证session,而不是重新产生session,以记录用户状态。通过验证flag是否为empty判断数据是否显示。最后封装成json发送到客户端
获取本次session的方法:
sessionid=_POST[“sess_sessionid”];//获取android客户端的sessionid
session_id($sessionid);//有参数
session_start();//启动session
具体代码如下:
- <?php
- header(<span class="string">“Content-Type: text/html; charset=utf-8”</span>) ;
- <span class="keyword">include</span>(<span class="string">‘conn.php’</span>);
- <span class="comment">//获取从客户端LoginSuccessActivity类传递的参数</span>
- <span class="vars">$userid</span>=<span class="vars">$_POST</span>[<span class="string">“sess_userid”</span>];
- <span class="vars">$username</span>=<span class="vars">$_POST</span>[<span class="string">“sess_username”</span>];
- <span class="comment">//获取客户端传递的session标识</span>
- <span class="vars">$sessionid</span>=<span class="vars">$_POST</span>[<span class="string">“sess_sessionid”</span>];
- session_id(<span class="vars">$sessionid</span>);
- <span class="comment">//将会根据session id获得原来的session</span>
- session_start();
- <span class="comment">//获取服务器端原来session记录的username,并且根据客户端传过来的username比较进行验证操作</span>
- <span class="vars">$sess_username</span>=<span class="vars">$_SESSION</span>[<span class="string">‘username’</span>];
- <span class="keyword">if</span>(<span class="vars">$username</span>==<span class="vars">$sess_username</span>){
- mysql_query(<span class="string">“set names utf8”</span>);
- <span class="comment">//查询用户基本信息</span>
- <span class="vars">$check_query</span> = mysql_query(<span class="string">“select userinfo,level from info where userid=’$userid’ limit 1”</span>);
- <span class="vars">$arr</span>=<span class="keyword">array</span>();<span class="comment">//空的数组</span>
- <span class="keyword">if</span>(<span class="vars">$result</span> = mysql_fetch_array(<span class="vars">$check_query</span>)){
- <span class="vars">$arr</span> = <span class="keyword">array</span>(
- <span class="string">‘flag’</span>=><span class="string">‘notempty’</span>,
- <span class="string">‘info’</span>=><span class="vars">$result</span>[<span class="string">‘userinfo’</span>],
- <span class="string">‘level’</span>=><span class="vars">$result</span>[<span class="string">‘level’</span>],
- <span class="string">‘sessionid’</span>=><span class="vars">$sessionid</span>
- );
- <span class="func">echo</span> json_encode(<span class="vars">$arr</span>);
- }
- } <span class="keyword">else</span> {
- <span class="vars">$arr</span> = <span class="keyword">array</span>(
- <span class="string">‘flag’</span>=><span class="string">’empty’</span>,
- <span class="string">‘name’</span>=><span class="string">”</span>,
- <span class="string">‘userid’</span>=><span class="string">”</span>,
- <span class="string">‘sessionid’</span>=><span class="vars">$sessionid</span>
- );
- <span class="func">echo</span> json_encode(<span class="vars">$arr</span>);
- }
- ?>
3.)数据库端(MYSQL)
采用mysql建立数据库,建立两个简单的数据表:user和info。
- /*
- MySQL Data Transfer
- Source Host: localhost
- Source <span class="keyword">Database</span>: login
- Target Host: localhost
- Target <span class="keyword">Database</span>: login
- <span class="keyword">Date</span>: 2011-6-14 11:10:46
- */
-
- <span class="keyword">SET</span> FOREIGN_KEY_CHECKS=0;
- <span class="comment">— —————————-</span>
- <span class="comment">— Table structure for info</span>
- <span class="comment">— —————————-</span>
- <span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `info` (
- `id` <span class="keyword">int</span>(12) <span class="op">NOT</span> <span class="op">NULL</span> AUTO_INCREMENT,
- `userid` <span class="keyword">int</span>(12) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- `userinfo` <span class="keyword">varchar</span>(100) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- `<span class="keyword">level</span>` <span class="keyword">int</span>(2) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> (`id`),
- <span class="keyword">KEY</span> `useid` (`userid`),
- <span class="keyword">CONSTRAINT</span> `useid` <span class="keyword">FOREIGN</span> <span class="keyword">KEY</span> (`userid`) <span class="keyword">REFERENCES</span> `<span class="func">user</span>` (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 <span class="keyword">DEFAULT</span> CHARSET=utf8;
-
- <span class="comment">— —————————-</span>
- <span class="comment">— Table structure for user</span>
- <span class="comment">— —————————-</span>
- <span class="keyword">CREATE</span> <span class="keyword">TABLE</span> `<span class="func">user</span>` (
- `id` <span class="keyword">int</span>(12) <span class="op">NOT</span> <span class="op">NULL</span> AUTO_INCREMENT,
- `<span class="keyword">name</span>` <span class="keyword">varchar</span>(20) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- `<span class="keyword">password</span>` <span class="keyword">varchar</span>(20) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- `status` <span class="keyword">int</span>(2) <span class="keyword">DEFAULT</span> <span class="op">NULL</span>,
- <span class="keyword">PRIMARY</span> <span class="keyword">KEY</span> (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 <span class="keyword">DEFAULT</span> CHARSET=utf8;
-
- <span class="comment">— —————————-</span>
- <span class="comment">— Records</span>
- <span class="comment">— —————————-</span>
- <span class="keyword">INSERT</span> <span class="keyword">INTO</span> `info` <span class="keyword">VALUES</span> (<span class="string">‘1’</span>, <span class="string">‘1’</span>, <span class="string">‘charlie is a developer.’</span>, <span class="string">‘1’</span>);
- <span class="keyword">INSERT</span> <span class="keyword">INTO</span> `info` <span class="keyword">VALUES</span> (<span class="string">‘2’</span>, <span class="string">‘2’</span>, <span class="string">‘william is a boss.’</span>, <span class="string">’20’</span>);
- <span class="keyword">INSERT</span> <span class="keyword">INTO</span> `<span class="func">user</span>` <span class="keyword">VALUES</span> (<span class="string">‘1’</span>, <span class="string">‘charlie’</span>, <span class="string">‘password’</span>, <span class="string">‘1’</span>);
- <span class="keyword">INSERT</span> <span class="keyword">INTO</span> `<span class="func">user</span>` <span class="keyword">VALUES</span> (<span class="string">‘2’</span>, <span class="string">‘william’</span>, <span class="string">‘mypassword’</span>, <span class="string">‘2’</span>);
运行效果如图:

图 -1 GetWebSession.java类的布局
图 -2 LoginSuccessActivity.java类获取的session id以及用户基本信息
图 -3 GetWebSession.java获取用户详细信息及本次session的一致性
转自:http://www.yoyong.com/archives/178


💬 评论