android使用webview登录,获取session传递到httpclient小例子

来源:互联网 发布:漩涡向日葵 知乎 编辑:程序博客网 时间:2024/04/27 23:06

转载自:     http://blog.csdn.net/pochuanpiao/article/details/17953645   

前几天完成了一个客户端小功能,使用html页面登录,

拿到cookie之后,传递给httpclient完成业务逻辑的访问,现在把基本的流程整理记录一下。


首先来一张Android工程的目录结构图吧,html、js文件都是放在assets下面的。



1、基本的html页面,index.html

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <meta http-equiv="Access-Control-Allow-Origin" content="*">  
  2. <div data-role="page" id="page_login">  
  3.       
  4.    <meta http-equiv="Access-Control-Allow-Origin" content="*">  
  5.    <link rel="stylesheet" href="jquery.mobile-1.0.min.css" />   
  6.    <script src="jquery-1.6.4.min.js"></script>  
  7.    <script src="jquery.mobile-1.0.min.js"></script>  
  8.    <script type="text/javascript" charset="utf-8" src="scripts/login.js"></script>  
  9.   
  10.   <div data-role="header">  
  11.     <h1>Login</h1>  
  12.   </div><!-- /header -->  
  13.   
  14.   <div data-role="content" class='content'>  
  15.     <div>  
  16.       <label for="page_login_name">Username</label>  
  17.       <input type="text" id="page_login_name" />  
  18.     </div>  
  19.     <div>  
  20.       <label for="page_login_pass">Password</label>  
  21.       <input type="password" id="page_login_pass" />  
  22.     </div>  
  23.     <fieldset>  
  24.       <div><button type="button" data-theme="b" id="page_login_submit">Login</button></div>  
  25.     </fieldset>  
  26.   </div><!-- /content -->  
  27.   
  28. </div><!-- /page -->  

代码中需要的jquery-1.6.4.min.js、jquery.mobile-1.0.min.js、jquery.mobile-1.0.min.css,请自己去官网上面下载吧

注意版本之间的差别,之前因为版本的不对,纠结了下。


2、JS登录的代码,login.js

[javascript] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. $('#page_login_submit').live('click'function(){  
  2.   var name = $('#page_login_name').val();  
  3.   if (!name)   
  4.   {   
  5.     alert('Please enter your user name.');  
  6.     <span style="white-space:pre">  </span>return false;   
  7.   }  
  8.   var pass = $('#page_login_pass').val();  
  9.   if (!pass)   
  10.   {   
  11.     alert('Please enter your password.');   
  12.     return false;   
  13.   }  
  14.     
  15.   // BEGIN  
  16.   $.ajax({  
  17.       url: "http://172.23.10.100/?q=rest_services/user/login.json",  
  18.       type: 'post',  
  19.       data: 'username=' + encodeURIComponent(name) + '&password=' + encodeURIComponent(pass),  
  20.       dataType: 'json',  
  21.       error: function(XMLHttpRequest, textStatus, errorThrown) {  
  22.         console.log(JSON.stringify(XMLHttpRequest));  
  23.         console.log(JSON.stringify(textStatus));  
  24.         console.log(JSON.stringify(errorThrown));  
  25.         alert('page_login_submit - failed to login');  
  26.       },  
  27.       success: function(data) {  
  28.       <span style="white-space:pre">    </span>alert(JSON.stringify(data));//注意,成功之后收到的data  
  29.       }  
  30.   });  
  31.   // END  
  32.   return false;  
  33. });  
这里偷懒把成功返回的json文件直接通过alert,回传给webview了

具体的项目中,可以写个函数来接收


3、页面准备好了,下面我们开始webview的测试代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.activity_main);  
  4.           
  5.         mWebView = (WebView)findViewById(R.id.webview);    
  6.         WebSettings wSet = mWebView.getSettings();       
  7.         wSet.setJavaScriptEnabled(true);  
  8.         wSet.setJavaScriptCanOpenWindowsAutomatically(true);  
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>//解决跨域访问的问题  
  2.         try {  
  3.                 if (Build.VERSION.SDK_INT >= 16) {  
  4.                     Class<?> clazz = mWebView.getSettings().getClass();  
  5.                     Method method = clazz.getMethod(  
  6.                             "setAllowUniversalAccessFromFileURLs"boolean.class);  
  7.                     if (method != null) {  
  8.                         method.invoke(mWebView.getSettings(), true);  
  9.                     }  
  10.                 }  
  11.             } catch (IllegalArgumentException e) {  
  12.                 e.printStackTrace();  
  13.             } catch (NoSuchMethodException e) {  
  14.                 e.printStackTrace();  
  15.             } catch (IllegalAccessException e) {  
  16.                 e.printStackTrace();  
  17.             } catch (InvocationTargetException e) {  
  18.                 e.printStackTrace();  
  19.             }  
  20.               
  21.               
  22.         mWebView.clearCache(true);  
  23.         CookieManager.getInstance().removeSessionCookie();  
  24.         mWebView.loadUrl(URL);    
  25.           
  26.         mWebView.setWebChromeClient(new WebChromeClient(){  
  27.               
  28.             public boolean onJsAlert(WebView view, String url, String message, JsResult result) {  
  29.                 //偷懒直接接收JS中传过来的msg  
  30.                 if(message.length() > 15){  
  31.                     mLoginBackJson = message;  
  32.                     Log.i(TAG, "mLoginBackJson = " + mLoginBackJson);  
  33.                     if(parseJson(mLoginBackJson)){//解析传回的json文件,成功的话,进行一次业务的访问  
  34.                         new MyTask().execute(ConfigUrl.ALL_CONTENT_VIEW);  
  35.                     }  
  36.                     //return true;  
  37.                 }  
  38.                 //保存一下cookie,后面httpclient使用  
  39.                 CookieManager cookieManager = CookieManager.getInstance();  
  40.                 CookieStr = cookieManager.getCookie(COOKIE_URL);  
  41.                   
  42.                 return super.onJsAlert(view, url, message, result);   
  43.             }  
  44.         });  
  45.     }  
activity_main.xml文件就比较简单了,只有一个webview。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.      >  
  5.   
  6.     <WebView   
  7.         android:id ="@+id/webview"       
  8.     android:layout_width ="match_parent"       
  9.     android:layout_height ="match_parent"  
  10.         />  
  11. </RelativeLayout>  


4、最后是一次http get请求,做一次业务的访问了。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. String jsonResponse = UtilHttp.executeGet(url + "&sessid=" + mSessionId + "&session_name=" + mSessionName,  
  2.                     null, CookieStr);  

主要参数CookieStr,httpclient里面会使用到。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.  public static DefaultHttpClient getHttpClient(){  
  2.         BasicHttpParams httpParams = new BasicHttpParams();  
  3.         HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);  
  4.         HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);  
  5.         DefaultHttpClient client = new DefaultHttpClient(httpParams);  
  6.   
  7.         return client;  
  8. }  

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static String executeGet(String url, List<BasicHeader> dataList, String cookie) {  
  2. try {  
  3.             StringBuffer sbResult = new StringBuffer();  
  4.             DefaultHttpClient client =  getHttpClient();  
  5.               
  6.             if(dataList != null && dataList.size() > 0)  
  7.             {  
  8.                 url+="?";  
  9.                 for(BasicHeader h:dataList){  
  10.                     url+=h.getName()+"="+h.getValue()+"&";  
  11.                 }  
  12.             }  
  13.               
  14.             HttpGet httpGet = new HttpGet(url);  
  15.             httpGet.setHeader("Cookie", cookie);//设置cookie  
  16.             HttpResponse response = client.execute(httpGet);  
  17.             sbResult = getResponse(sbResult, response);  
  18.             Log.d(TAG,"executeGet url = "+url + "  StatusCode:"+response.getStatusLine().getStatusCode());  
  19.             if( response.getStatusLine().getStatusCode() != HttpStatus.SC_OK )  
  20.                 return null;  
  21.             return sbResult.toString();  
  22.         }catch (TimeoutException e) {  
  23.             Log.d(TAG,"executeGet TimeoutException..");  
  24.             return "timeout";  
  25.         }catch (SocketTimeoutException e) {  
  26.             Log.d(TAG,"executeGet SocketTimeoutException..");  
  27.             return "timeout";  
  28.         }catch (ConnectTimeoutException e) {  
  29.             Log.d(TAG,"executeGet ConnectTimeoutException..");  
  30.             return "timeout";  
  31.         }catch(Exception e){  
  32.             e.printStackTrace();  
  33.         }  
  34.         return null;  
  35.     }  

如果我们拿到的jsonResponse的值不是null,就证明成功了。

0 0
原创粉丝点击