上個月接到了我公司年會系統的需求,覺得做起來有些困難。後來硬著頭皮接下來了。年會1月6號順利舉辦結束,整體上還算是成功,但是最後的搖一搖比賽出了些問題。在這裡記錄下用到的技術,遇到的困難和選擇,以及做的處理和不足。希望對於大家有些參考。
1.做乙個系統,需要權衡的維度,有如下幾個:
這就好比經典的cap理論,魚和熊掌不可兼得。這裡追求了時間(只有兩周多的開發時間),成本(實際上不應該過分壓縮成本),功能(做全所有功能),放低了安全與嚴密的要求(例如訊息傳遞沒有加密,傳遞的訊息沒有蓋時間戳驗證流程,沒有完整的會話保持與許可權控制等等),而且把**放到了github上。
對於乙個針對於普通大眾的年會,這麼做可能是沒問題的。但是對於乙個純程式設計師的年會,這麼做就難免出問題(我們現場系統受到了js注入,xss注入,sql注入還有指令注入攻擊。我們現場改**熱部署)。
現在回想,應該把一些功能做的更嚴密些,不應該過分壓縮成本(其實就是多買兩台伺服器的事。。。)
2.對於你做的系統,涉及到現場螢幕視覺設計的,一定要提早模擬下視覺匹配
3.之前對於websocket的理解有誤,只在,對於需要單向推送到客戶端(手機瀏覽器)上的訊息,應該都用websocket,而不是採用客戶端輪詢。輪詢對於伺服器消耗太大。然後,其實更多情景應該用sse
6. 彈幕做了服務降級,其實搖一搖那裡也應該做服務降級
申請好後,我們看到:
第一步:拼接自己的連線:wx0c7b8ab55037d5ca
scope
應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊),這裡我們需要用snsapi_userinfo
response_type
只能填寫code
state
重定向到你的頁面時會帶上這個state引數,沒用的話隨便填寫就行了
redirect_uri
網域名稱一定要和你配置的一樣,否則會報redirect_uri錯誤,需要url編碼
跳轉的鏈結需要接收兩個引數,乙個是code,乙個是state;假設我們這裡跳轉的位址為「/weixin/login」,則位址路徑為:經過url編碼為:http%3a%2f%2f127.0.0.1%2fweixin%2flogin
public
class
basereturn
implements
serializable
public
void
seterrcode(int errcode)
public string geterrmsg()
public
void
seterrmsg(string errmsg)
public
boolean
issuccessful()
}
客戶端根據臨時令牌code從服務提供方那裡獲取訪問令牌access token的返回的類如下:
public
class
userauthorizationreturn
extends
basereturn
public
void
setscope(string scope)
public string getopenid()
public
void
setopenid(string openid)
public string getrefresh_token()
public
void
setrefresh_token(string refresh_token)
public
intgetexpires_in()
public
void
setexpires_in(int expires_in)
public string getaccess_token()
public
void
setaccess_token(string access_token)
}
由於年會只有乙個晚上,我們不用更新使用者資訊,所以對這裡的expires_in並不做處理。
之後通過accesstoken拿取使用者資訊返回的類如下:
public
class
userinforeturn
extends
basereturn
public
void
setopenid(string openid)
public string getnickname()
public
void
setnickname(string nickname)
public
intget***()
public
void
set***(int ***)
public string getprovince()
public
void
setprovince(string province)
public string getcity()
public
void
setcity(string city)
public string getcountry()
public
void
setcountry(string country)
public string getheadimgurl()
public
void
setheadimgurl(string headimgurl)
public string getprivilege()
public
void
setprivilege(string privilege)
public string getunionid()
public
void
setunionid(string unionid)
}
第三步,根據上面的流程,編寫下面**,拿取使用者資訊:
完整的**:
}這裡我們偷懶了,並沒有嚴格的會話和登入許可權控制,只是做了簡單的cookie。面對都是程式設計師的晚會,不應該做這麼簡單的登陸控制。
在使用者第一次成功登陸也就是簽到成功時,伺服器需要將這個簽到訊息推送給客戶端。這種單項推送的技術,有很多可以選擇:
http輪詢和長輪詢:最容易實現,但是比較繁瑣而且耗費伺服器資源. 簡易輪詢由於其本身的缺陷,並不推薦使用。comet 技術並不是 html 5 標準的一部分,從相容標準的角度出發,也不推薦使用。
websocket:全雙工協議,可以用。市面上所有瀏覽器都支援,對於spring有很好的整合,但是是從spring 4.0開始的,我們用的框架基於spring 3.x,來不及公升級。但是tomcat 7.x有現成的websocket實現。websocket 規範和伺服器推送技術都是 html 5 標準的組成部分,在主流瀏覽器上都提供了原生的支援,是推薦使用的。
sse伺服器傳送事件:對於簡單的伺服器資料推送的場景,使用伺服器推送(sse技術)事件就足夠了。這個是最適合的,可惜當時我不知道這個技術。可以參考:
伺服器通過websocket通道,將人員簽到的資訊推送至簽到牆頁面,這裡我運用的是最簡單的tomcat 7的websocket實現。
由去中興的一次一次面試想到的
話題還是那天的中興的面試和中興計算機培訓,我今天早上突然之間明白了一些事情 於是不敢獨享,和大家一起 這還要從乙個故事說起 以前有乙個很成功的商人,有一次應邀參加乙個演講,他上台後馬上提了乙個問題 如果在座的各位被告知某地有 而這個地方的四周都是海,那你會怎麼做呢?下面的人紛紛議論,當然要馬上僱一艘...
由一道C 題所想到的
前段時間在睿思上 vivianliu出了如下一道c 題目 給定乙個類 class mycl protected virtual int geta int main 可見輸出是乙個未初始化的a。先上 吧 class myder mycl 同樣是派生乙個子類 int main 為下文修改記憶體分配策略 ...
一次面試想到的
前一階段,公司招乙個軟體開發人員,要求要3年以上的開發經驗,見到許多面試人員,都不是太理想,只慨嘆人才雖多,但良才難求啊。一日,在網上看到乙份簡歷,軟體專業碩士畢業,工作了4年,而且工作經歷,與我的要求很接近,於是興沖沖地約過來面試,這名求職者也很爽快地答應了。hr約好後,我又仔細地瀏覽一下簡歷,發...