Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android實現discuz論壇的登錄

android實現discuz論壇的登錄

編輯:關於Android編程

今天工作中遇到的一個問題,需求是這樣的,需要給dz的論壇做一個android擴展,這肯定少不了會員登錄,就得需要二次開發dz提供一個登錄接口,眩暈中。。。

因為我對dz不熟悉,所以這個工作對我來說還是有難度的。

仔細分析了一下,在android上為什麼需要客戶端登錄? 答案是肯定的,就是為了獲取能唯一標識該用戶的信息——uid,其實登錄的目的就是這麼單純(提供接口不也是給客戶端一個uid嘛)。

那既然只是為了獲取一個uid,我們應該還有其他的方式獲取,首先就想到了用WEB登錄的方式,因為dz已經提供了WAP模塊,所以完全可以在應用內以WebView展示一個登錄界面讓用戶登錄。

那問題來了, 用戶登錄後我們怎麼獲取他的uid呢? 畢竟不是在我們的代碼中登錄的。。。

反復搜索,終於找到了一個叫:CookieManager的東西,這個類可以獲取WebView中的cookie,那我們直接從cookie中獲取uid不就ok了?

懷著激動的心情,打開chrome的debug,不斷登錄...退出...就是為了找到uid的身影,當然結果是令人失望的。

vcyjrLrcv+yjrNXiuPbOxLz+09DBy6O6L3NvdXJjZS9jbGFzcy9jbGFzc19tZW1iZXIucGhwo6y+zcrH1eK49s7EvP7W0LSmwO21xLXHwryjrLTyv6q/tNK7z8KjrLrcs6SjrLWrysfT0Lj2t723qNL9xvDBy87StcTXotLio7pmdW5jdGlvbiBvbl9sb2dpbigpCiCjrCDX9mFuZHJvaWS1xNOmuMPSuyYjMzA1MjQ7vs2/tLP2wLTBy6Os1eLKx7XHwry1xKGwu9i196Gxo6zXotLiu9i1987SvNPS/brFwcujrLWrysfQoc+4vdrO0sPHsrvTw7nY0MSjrNfu1vfSqrXEo6zO0sPHwvWz9sHL0ru087K9o6y8zND45K/AwLT6wuujrM7St6LP1s7Su7nKx7rc0NLUy7XEo6y63L/s1Nq089S8Mjc10NC1xM671sOjrM7St6LP1sHL0ru2zmpztPrC66OszqrKssO01eK2zmpztPrC67vh0v3G8M7StcTXotLixNijvyDE47+0v7S+zdaqtcDBy6O6"setTimeout("window.location.href =\''.$href.'\';", 3000);' 大家都知道,在dz中登錄成功會用一個幾秒中的等待然後跳轉的,找到這段代碼太令人興奮了,那就在這段代碼的前後找找,看看有沒有位置設置咱們的cookie。

往上看代碼,又一個興奮點來了:if(defined('IN_MOBILE')) 這難道就是區分手機和PC登錄的?,二話不說在這裡面設置uid的cookie試試:dsetcookie('uid', $_G['uid']); 唉? 怎麼和PHP設置cookie的函數不一樣? 當你看這個源文件的時候,你會發現很多dsetcookie的代碼,這肯定是dz對setcookie的一次封裝,咱們直接copy用就ok了,還有一個$_G['uid']也是在這個文件中發現的,我猜測它就是用戶的uid了。

趕緊測試一下,好吧。。。在cookie中沒有發現uid的身影。。那把設置cookie的這句話網上放放。代碼往上走又是一個if語句,這次我直接跳過這個if,直接在if的上面停放了dsetcookie('uid', $_G['uid']); 這句話,繼續跟進測試,這次終於在cookie中多了一項,而且,正好,該項是以uid結尾的:

\


小小激動一下,現在咱們完全可以在cookie中獲取uid的值了。

接下來就是android客戶端的任務了, 肯定就是一個webview加載dz的登錄界面了,這個就不說了,來看看cookie是怎麼處理的。

在WebViewClient的onPageFinished方法中:

CookieManager cookieManager = CookieManager.getInstance();
String cookies = cookieManager.getCookie(url);
if (null != cookies) {
	parseUid(cookies);
}
第一行,我們通過CookieManager的靜態方法獲取CookieManager實例,緊接著第二行中通過getCookie(String url)方法,獲取改url上的cookie,是不是很方便?

在if中調用了一個parseUid的方法,很明顯,我們要去取其中的uid了,跟進去看看:

private void parseUid(String cookies) {
	String[] cookieKeyValues = cookies.split(";");
	for(String cookieItem : cookieKeyValues) {
		if(cookieItem.trim().startsWith("XXX_XXXX_uid")) {
			String uid = cookieItem.split("=")[1];
			System.out.println("uid = " + uid);
			SharedPreferences.Editor editor = getSharedPreferences(
					Constants.CONFIG, Context.MODE_PRIVATE).edit();
			editor.putBoolean(Constants.IS_LOGIN, true);
			editor.putInt(Constants.UID, Integer.parseInt(uid));
			editor.commit();
			finish();
		}
	}
}
在這個方法中,首先我們用;分割出每一條cookie,因為我發現,多個cookie都是以;分割的,接下來一個遍歷,找到以咱們關心的那個cookie的key開頭的,然後繼續用=分割,因為在字符串中cookie是以key=value的形式存在的。至此,咱們需要的uid就找到了,接下來的幾行代碼就是寫入到本地了,不多說了。


總結:

有時候,一些看似復雜的事情,完全可以用很簡單的方式去實現,不過,這需要我們轉變一下思路,從另一個思路去思考問題。

當然,上面這種做法肯定有不完美的地方,而且這種方法對於熟悉dz的人來說完全沒有必要,但結果還算可以,畢竟給我們省下來很多代碼,服務器僅用了一行代碼,客戶端也區區不到20行的代碼就搞定了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved