簡(jiǎn)單-3種 web 會(huì)話管理的方式

http是無狀態(tài)的状原,一次請(qǐng)求結(jié)束,連接斷開抓艳,下次服務(wù)器再收到請(qǐng)求触机,它就不知道這個(gè)請(qǐng)求是哪個(gè)用戶發(fā)過來的。當(dāng)然它知道是哪個(gè)客戶端地址發(fā)過來的玷或,但是對(duì)于我們的應(yīng)用來說威兜,我們是靠用戶來管理,而不是靠客戶端庐椒。所以對(duì)我們的應(yīng)用而言,它是需要有狀態(tài)管理的蚂踊,以便服務(wù)端能夠準(zhǔn)確的知道http請(qǐng)求是哪個(gè)用戶發(fā)起的约谈,從而判斷他是否有權(quán)限繼續(xù)這個(gè)請(qǐng)求。這個(gè)過程就是常說的會(huì)話管理犁钟。它也可以簡(jiǎn)單理解為一個(gè)用戶從登錄到退出應(yīng)用的一段期間棱诱。本文總結(jié)了3種常見的實(shí)現(xiàn)web應(yīng)用會(huì)話管理的方式:
1)基于server端session的管理方式
2)cookie-base的管理方式
3)token-base的管理方式
這些內(nèi)容可以幫助加深對(duì)web中用戶登錄機(jī)制的理解,對(duì)實(shí)際項(xiàng)目開發(fā)也有參考價(jià)值涝动,歡迎閱讀與指正迈勋。

1. 基于server端session的管理
在早期web應(yīng)用中,通常使用服務(wù)端session來管理用戶的會(huì)話醋粟∶夜剑快速了解服務(wù)端session:

  1. 服務(wù)端session是用戶第一次訪問應(yīng)用時(shí),服務(wù)器就會(huì)創(chuàng)建的對(duì)象米愿,代表用戶的一次會(huì)話過程厦凤,可以用來存放數(shù)據(jù)。服務(wù)器為每一個(gè)session都分配一個(gè)唯一的sessionid育苟,以保證每個(gè)用戶都有一個(gè)不同的session對(duì)象较鼓。
    2)服務(wù)器在創(chuàng)建完session后,會(huì)把sessionid通過cookie返回給用戶所在的瀏覽器违柏,這樣當(dāng)用戶第二次及以后向服務(wù)器發(fā)送請(qǐng)求的時(shí)候博烂,就會(huì)通過cookie把sessionid傳回給服務(wù)器,以便服務(wù)器能夠根據(jù)sessionid找到與該用戶對(duì)應(yīng)的session對(duì)象漱竖。
    3)session通常有失效時(shí)間的設(shè)定禽篱,比如2個(gè)小時(shí)。當(dāng)失效時(shí)間到闲孤,服務(wù)器會(huì)銷毀之前的session谆级,并創(chuàng)建新的session返回給用戶烤礁。但是只要用戶在失效時(shí)間內(nèi),有發(fā)送新的請(qǐng)求給服務(wù)器肥照,通常服務(wù)器都會(huì)把他對(duì)應(yīng)的session的失效時(shí)間根據(jù)當(dāng)前的請(qǐng)求時(shí)間再延長(zhǎng)2個(gè)小時(shí)脚仔。
    4)session在一開始并不具備會(huì)話管理的作用。它只有在用戶登錄認(rèn)證成功之后舆绎,并且往sesssion對(duì)象里面放入了用戶登錄成功的憑證鲤脏,才能用來管理會(huì)話。管理會(huì)話的邏輯也很簡(jiǎn)單吕朵,只要拿到用戶的session對(duì)象猎醇,看它里面有沒有登錄成功的憑證,就能判斷這個(gè)用戶是否已經(jīng)登錄努溃。當(dāng)用戶主動(dòng)退出的時(shí)候硫嘶,會(huì)把它的session對(duì)象里的登錄憑證清掉。所以在用戶登錄前或退出后或者session對(duì)象失效時(shí)梧税,肯定都是拿不到需要的登錄憑證的沦疾。

    以上過程可簡(jiǎn)單使用流程圖描述如下:

    主流的web開發(fā)平臺(tái)(java,.net,php)都原生支持這種會(huì)話管理的方式,而且開發(fā)起來很簡(jiǎn)單第队,相信大部分后端開發(fā)人員在入門的時(shí)候都了解并使用過它哮塞。它還有一個(gè)比較大的優(yōu)點(diǎn)就是安全性好,因?yàn)樵跒g覽器端與服務(wù)器端保持會(huì)話狀態(tài)的媒介始終只是一個(gè)sessionid串凳谦,只要這個(gè)串夠隨機(jī)忆畅,攻擊者就不能輕易冒充他人的sessionid進(jìn)行操作;除非通過CSRF或http劫持的方式尸执,才有可能冒充別人進(jìn)行操作家凯;即使冒充成功,也必須被冒充的用戶session里面包含有效的登錄憑證才行如失。但是在真正決定用它管理會(huì)話之前肆饶,也得根據(jù)自己的應(yīng)用情況考慮以下幾個(gè)問題:
    1)這種方式將會(huì)話信息存儲(chǔ)在web服務(wù)器里面,所以在用戶同時(shí)在線量比較多時(shí)岖常,這些會(huì)話信息會(huì)占據(jù)比較多的內(nèi)存驯镊;
    2)當(dāng)應(yīng)用采用集群部署的時(shí)候,會(huì)遇到多臺(tái)web服務(wù)器之間如何做session共享的問題竭鞍。因?yàn)閟ession是由單個(gè)服務(wù)器創(chuàng)建的板惑,但是處理用戶請(qǐng)求的服務(wù)器不一定是那個(gè)創(chuàng)建session的服務(wù)器,這樣他就拿不到之前已經(jīng)放入到session中的登錄憑證之類的信息了偎快;
    3)多個(gè)應(yīng)用要共享session時(shí)冯乘,除了以上問題,還會(huì)遇到跨域問題晒夹,因?yàn)椴煌膽?yīng)用可能部署的主機(jī)不一樣裆馒,需要在各個(gè)應(yīng)用做好cookie跨域的處理姊氓。

    針對(duì)問題1和問題2,我見過的解決方案是采用redis這種中間服務(wù)器來管理session的增刪改查喷好,一來減輕web服務(wù)器的負(fù)擔(dān)翔横,二來解決不同web服務(wù)器共享session的問題。針對(duì)問題3梗搅,由于服務(wù)端的session依賴cookie來傳遞sessionid禾唁,所以在實(shí)際項(xiàng)目中,只要解決各個(gè)項(xiàng)目里面如何實(shí)現(xiàn)sessionid的cookie跨域訪問即可无切,這個(gè)是可以實(shí)現(xiàn)的荡短,就是比較麻煩,前后端有可能都要做處理哆键。
    如果不考慮以上三個(gè)問題掘托,這種管理方式比較值得使用,尤其是一些小型的web應(yīng)用籍嘹。但是一旦應(yīng)用將來有擴(kuò)展的必要烫映,那就得謹(jǐn)慎對(duì)待前面的三個(gè)問題。如果真要在項(xiàng)目中使用這種方式噩峦,推薦結(jié)合單點(diǎn)登錄框架如CAS一起用,這樣會(huì)使應(yīng)用的擴(kuò)展性更強(qiáng)抽兆。

2. cookie-based的管理方式

由于前一種方式會(huì)增加服務(wù)器的負(fù)擔(dān)和架構(gòu)的復(fù)雜性识补,所以后來就有人想出直接把用戶的登錄憑證直接存到客戶端的方案,當(dāng)用戶登錄成功之后辫红,把登錄憑證寫到cookie里面凭涂,并給cookie設(shè)置有效期,后續(xù)請(qǐng)求直接驗(yàn)證存有登錄憑證的cookie是否存在以及憑證是否有效贴妻,即可判斷用戶的登錄狀態(tài)切油。使用它來實(shí)現(xiàn)會(huì)話管理的整體流程如下:
1)用戶發(fā)起登錄請(qǐng)求,服務(wù)端根據(jù)傳入的用戶密碼之類的身份信息名惩,驗(yàn)證用戶是否滿足登錄條件澎胡,如果滿足,就根據(jù)用戶信息創(chuàng)建一個(gè)登錄憑證娩鹉,這個(gè)登錄憑證簡(jiǎn)單來說就是一個(gè)對(duì)象攻谁,最簡(jiǎn)單的形式可以只包含用戶id,憑證創(chuàng)建時(shí)間和過期時(shí)間三個(gè)值弯予。
2)服務(wù)端把上一步創(chuàng)建好的登錄憑證戚宦,先對(duì)它做數(shù)字簽名,然后再用對(duì)稱加密算法做加密處理锈嫩,將簽名受楼、加密后的字串垦搬,寫入cookie。cookie的名字必須固定(如ticket)艳汽,因?yàn)楹竺嬖佾@取的時(shí)候猴贰,還得根據(jù)這個(gè)名字來獲取cookie值。這一步添加數(shù)字簽名的目的是防止登錄憑證里的信息被篡改骚灸,因?yàn)橐坏┬畔⒈淮鄹脑阒海敲聪乱徊阶龊灻?yàn)證的時(shí)候肯定會(huì)失敗。做加密的目的甚牲,是防止cookie被別人截取的時(shí)候义郑,無法輕易讀到其中的用戶信息。
3)用戶登錄后發(fā)起后續(xù)請(qǐng)求丈钙,服務(wù)端根據(jù)上一步存登錄憑證的cookie名字非驮,獲取到相關(guān)的cookie值。然后先做解密處理雏赦,再做數(shù)字簽名的認(rèn)證劫笙,如果這兩步都失敗,說明這個(gè)登錄憑證非法星岗;如果這兩步成功填大,接著就可以拿到原始存入的登錄憑證了。然后用這個(gè)憑證的過期時(shí)間和當(dāng)前時(shí)間做對(duì)比俏橘,判斷憑證是否過期允华,如果過期,就需要用戶再重新登錄寥掐;如果未過期靴寂,則允許請(qǐng)求繼續(xù)。


這種方式最大的優(yōu)點(diǎn)就是實(shí)現(xiàn)了服務(wù)端的無狀態(tài)化召耘,徹底移除了服務(wù)端對(duì)會(huì)話的管理的邏輯百炬,服務(wù)端只需要負(fù)責(zé)創(chuàng)建和驗(yàn)證登錄cookie即可,無需保持用戶的狀態(tài)信息污它。對(duì)于第一種方式的第二個(gè)問題剖踊,用戶會(huì)話信息共享的問題,它也能很好解決:因?yàn)槿绻皇峭粋€(gè)應(yīng)用做集群部署衫贬,由于驗(yàn)證登錄憑證的代碼都是一樣的蜜宪,所以不管是哪個(gè)服務(wù)器處理用戶請(qǐng)求,總能拿到cookie中的登錄憑證來進(jìn)行驗(yàn)證祥山;如果是不同的應(yīng)用圃验,只要每個(gè)應(yīng)用都包含相同的登錄邏輯,那么他們也是能輕易實(shí)現(xiàn)會(huì)話共享的缝呕,不過這種情況下澳窑,登錄邏輯里面數(shù)字簽名以及加密解密要用到的密鑰文件或者密鑰串斧散,需要在不同的應(yīng)用里面共享,總而言之摊聋,就是需要算法完全保持一致鸡捐。
這種方式由于把登錄憑證直接存放客戶端,并且需要cookie傳來傳去麻裁,所以它的缺點(diǎn)也比較明顯:
1)cookie有大小限制箍镜,存儲(chǔ)不了太多數(shù)據(jù),所以要是登錄憑證存的消息過多煎源,導(dǎo)致加密簽名后的串太長(zhǎng)色迂,就會(huì)引發(fā)別的問題,比如其它業(yè)務(wù)場(chǎng)景需要cookie的時(shí)候手销,就有可能沒那么多空間可用了歇僧;所以用的時(shí)候得謹(jǐn)慎,得觀察實(shí)際的登錄cookie的大蟹嫱稀诈悍;比如太長(zhǎng),就要考慮是非是數(shù)字簽名的算法太嚴(yán)格兽埃,導(dǎo)致簽名后的串太長(zhǎng)侥钳,那就適當(dāng)調(diào)整簽名邏輯;比如如果一開始用4096位的RSA算法做數(shù)字簽名柄错,可以考慮換成1024舷夺、2048位;
2)每次傳送cookie鄙陡,增加了請(qǐng)求的數(shù)量,對(duì)訪問性能也有影響躏啰;
3)也有跨域問題趁矾,畢竟還是要用cookie。
相比起第一種方式给僵,cookie-based方案明顯還是要好一些毫捣,目前好多web開發(fā)平臺(tái)或框架都默認(rèn)使用這種方式來做會(huì)話管理,比如php里面yii框架帝际,這是我們團(tuán)隊(duì)后端目前用的蔓同,它用的就是這個(gè)方案,以上提到的那些登錄邏輯蹲诀,框架也都已經(jīng)封裝好了斑粱,實(shí)際用起來也很簡(jiǎn)單;asp.net里面forms身份認(rèn)證脯爪,也是這個(gè)思路则北,這里有一篇好文章把它的實(shí)現(xiàn)細(xì)節(jié)都說的很清楚:
http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html
前面兩種會(huì)話管理方式因?yàn)槎加玫絚ookie矿微,不適合用在native app里面:native app不好管理cookie,畢竟它不是瀏覽器尚揣。這兩種方案都不適合用來做純api服務(wù)的登錄認(rèn)證涌矢。要實(shí)現(xiàn)api服務(wù)的登錄認(rèn)證,就要考慮下面要介紹的第三種會(huì)話管理方式快骗。

3. token-based的管理方式

這種方式從流程和實(shí)現(xiàn)上來說娜庇,跟cookie-based的方式?jīng)]有太多區(qū)別,只不過cookie-based里面寫到cookie里面的ticket在這種方式下稱為token方篮,這個(gè)token在返回給客戶端之后名秀,后續(xù)請(qǐng)求都必須通過url參數(shù)或者是http header的形式,主動(dòng)帶上token恭取,這樣服務(wù)端接收到請(qǐng)求之后就能直接從http header或者url里面取到token進(jìn)行驗(yàn)證:



這種方式不通過cookie進(jìn)行token的傳遞泰偿,而是每次請(qǐng)求的時(shí)候,主動(dòng)把token加到http header里面或者url后面蜈垮,所以即使在native app里面也能使用它來調(diào)用我們通過web發(fā)布的api接口耗跛。app里面還要做兩件事情:
1)有效存儲(chǔ)token,得保證每次調(diào)接口的時(shí)候都能從同一個(gè)位置拿到同一個(gè)token攒发;
2)每次調(diào)接口的的代碼里都得把token加到header或者接口地址里面调塌。
看起來麻煩,其實(shí)也不麻煩惠猿,這兩件事情羔砾,對(duì)于app來說,很容易做到偶妖,只要對(duì)接口調(diào)用的模塊稍加封裝即可姜凄。
這種方式同樣適用于網(wǎng)頁(yè)應(yīng)用,token可以存于localStorage或者sessionStorage里面趾访,然后每發(fā)ajax請(qǐng)求的時(shí)候态秧,都把token拿出來放到ajax請(qǐng)求的header里即可。不過如果是非接口的請(qǐng)求扼鞋,比如直接通過點(diǎn)擊鏈接請(qǐng)求一個(gè)頁(yè)面這種申鱼,是無法自動(dòng)帶上token的。所以這種方式也僅限于走純接口的web應(yīng)用云头。
這種方式用在web應(yīng)用里也有跨域的問題捐友,比如應(yīng)用如果部署在a.com,api服務(wù)部署在b.com溃槐,從a.com里面發(fā)出ajax請(qǐng)求到b.com匣砖,默認(rèn)情況下是會(huì)報(bào)跨域錯(cuò)誤的,這種問題可以用CORS(跨域資源共享)的方式來快速解決,相關(guān)細(xì)節(jié)可去閱讀前面給出的CORS文章詳細(xì)了解脆粥。
這種方式跟cookie-based的方式同樣都還有的一個(gè)問題就是ticket或者token刷新的問題砌溺。有的產(chǎn)品里面,你肯定不希望用戶登錄后变隔,操作了半個(gè)小時(shí)规伐,結(jié)果ticket或者token到了過期時(shí)間,然后用戶又得去重新登錄的情況出現(xiàn)匣缘。這個(gè)時(shí)候就得考慮ticket或token的自動(dòng)刷新的問題猖闪,簡(jiǎn)單來說,可以在驗(yàn)證ticket或token有效之后肌厨,自動(dòng)把ticket或token的失效時(shí)間延長(zhǎng)培慌,然后把它再返回給客戶端;客戶端如果檢測(cè)到服務(wù)器有返回新的ticket或token柑爸,就替換原來的ticket或token吵护。

4. 安全問題

在web應(yīng)用里面,會(huì)話管理的安全性始終是最重要的安全問題表鳍,這個(gè)對(duì)用戶的影響極大馅而。
首先從會(huì)話管理憑證來說,第一種方式的會(huì)話憑證僅僅是一個(gè)session id譬圣,所以只要這個(gè)session id足夠隨機(jī)瓮恭,而不是一個(gè)自增的數(shù)字id值,那么其它人就不可能輕易地冒充別人的session id進(jìn)行操作厘熟;第二種方式的憑證(ticket)以及第三種方式的憑證(token)都是一個(gè)在服務(wù)端做了數(shù)字簽名屯蹦,和加密處理的串,所以只要密鑰不泄露绳姨,別人也無法輕易地拿到這個(gè)串中的有效信息并對(duì)它進(jìn)行篡改登澜。總之飘庄,這三種會(huì)話管理方式的憑證本身是比較安全的脑蠕。
然后從客戶端和服務(wù)端的http過程來說,當(dāng)別人截獲到客戶端請(qǐng)求中的會(huì)話憑證竭宰,就能拿這個(gè)憑證冒充原用戶空郊,做一些非法操作份招,而服務(wù)器也認(rèn)不出來切揭。這種安全問題,可以簡(jiǎn)單采用https來解決锁摔,雖然可能還有http劫持這種更高程度的威脅存在廓旬,但是我們從代碼能做的防范,確實(shí)也就是這個(gè)層次了。
最后的安全問題就是CSRF(跨站請(qǐng)求偽造)孕豹。這個(gè)跟代碼有很大關(guān)系涩盾,本質(zhì)上它就是代碼的漏洞,只不過一般情況下這些漏洞励背,作為開發(fā)人員都不容易發(fā)現(xiàn)春霍,只有那些一門心思想搞些事情的人才會(huì)專門去找這些漏洞,所以這種問題的防范更多地還是依賴于開發(fā)人員對(duì)這種攻擊方式的了解叶眉,包括常見的攻擊形式和應(yīng)對(duì)方法址儒。不管憑證信息本身多么安全,別人利用CSRF衅疙,就能拿到別人的憑證莲趣,然后用它冒充別人進(jìn)行非法操作,所以有時(shí)間還真得多去了解下它的相關(guān)資料才行饱溢。舉例來說喧伞,假如我們把憑證直接放到url后面進(jìn)行傳遞,就有可能成為一個(gè)CSRF的漏洞:當(dāng)惡意用戶在我們的應(yīng)用內(nèi)上傳了1張引用了他自己網(wǎng)站的圖片绩郎,當(dāng)正常的用戶登錄之后訪問的頁(yè)面里面包含這個(gè)圖片的時(shí)候潘鲫,由于這個(gè)圖片加載的時(shí)候會(huì)向惡意網(wǎng)站發(fā)送get請(qǐng)求;當(dāng)惡意網(wǎng)站收到請(qǐng)求的時(shí)候嗽上,就會(huì)從這個(gè)請(qǐng)求的Reffer header里面看到包含這個(gè)圖片的頁(yè)面地址次舌,而這個(gè)地址正好包含了正常用戶的會(huì)話憑證;于是惡意用戶就拿到了正常用戶的憑證兽愤;只要這個(gè)憑證還沒失效彼念,他就能用它冒充用戶進(jìn)行非法操作。

5. 總結(jié)
前面這三種方式浅萧,各自有各自的優(yōu)點(diǎn)及使用場(chǎng)景逐沙,我覺得沒有哪個(gè)是最好的,做項(xiàng)目的時(shí)候洼畅,根據(jù)項(xiàng)目將來的擴(kuò)展情況和架構(gòu)情況吩案,才能決定用哪個(gè)是最合適的。本文的目的也就是想介紹這幾種方式的原理帝簇,以便掌握web應(yīng)用中登錄驗(yàn)證的關(guān)鍵因素徘郭。
作為一個(gè)前端開發(fā)人員,本文雖然介紹了3種會(huì)話管理的方式丧肴,但是與前端關(guān)系最緊密的還是第三種方式残揉,畢竟現(xiàn)在前端開發(fā)SPA應(yīng)用以及hybrid應(yīng)用已經(jīng)非常流行了,所以掌握好這個(gè)方式的認(rèn)證過程和使用方式芋浮,對(duì)前端來說抱环,顯然是很有幫助的。好在這個(gè)方式的技術(shù)其實(shí)早就有很多實(shí)現(xiàn)了,而且還有現(xiàn)成的標(biāo)準(zhǔn)可用镇草,這個(gè)標(biāo)準(zhǔn)就是JWT(json-web-token)眶痰。
JWT本身并沒有做任何技術(shù)實(shí)現(xiàn),它只是定義了token-based的管理方式該如何實(shí)現(xiàn)梯啤,它規(guī)定了token的應(yīng)該包含的標(biāo)準(zhǔn)內(nèi)容以及token的生成過程和方法竖伯。目前實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn)的技術(shù)已經(jīng)有非常多:


更多可參閱:https://jwt.io/#libraries-io
為了對(duì)第三種會(huì)話管理方式的實(shí)現(xiàn)有個(gè)更全面的認(rèn)識(shí),我選擇用express和上面眾多JWT實(shí)現(xiàn)中的jsonwebtoken來研究因宇,相關(guān)內(nèi)容我會(huì)在下一篇博客詳細(xì)介紹黔夭。本文內(nèi)容到此結(jié)束,謝謝閱讀羽嫡,歡迎關(guān)注下一篇博客的內(nèi)容本姥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杭棵,隨后出現(xiàn)的幾起案子婚惫,更是在濱河造成了極大的恐慌,老刑警劉巖魂爪,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先舷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滓侍,警方通過查閱死者的電腦和手機(jī)蒋川,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩笆,“玉大人捺球,你說我怎么就攤上這事∠Τ澹” “怎么了氮兵?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歹鱼。 經(jīng)常有香客問我泣栈,道長(zhǎng),這世上最難降的妖魔是什么弥姻? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任南片,我火速辦了婚禮,結(jié)果婚禮上庭敦,老公的妹妹穿的比我還像新娘疼进。我一直安慰自己,他們只是感情好螺捐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布颠悬。 她就那樣靜靜地躺著,像睡著了一般定血。 火紅的嫁衣襯著肌膚如雪赔癌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天澜沟,我揣著相機(jī)與錄音灾票,去河邊找鬼。 笑死茫虽,一個(gè)胖子當(dāng)著我的面吹牛刊苍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播濒析,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼正什,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了号杏?” 一聲冷哼從身側(cè)響起婴氮,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盾致,沒想到半個(gè)月后主经,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庭惜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年罩驻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片护赊。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惠遏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骏啰,到底是詐尸還是另有隱情爽哎,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布器一,位于F島的核電站课锌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祈秕。R本人自食惡果不足惜渺贤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望请毛。 院中可真熱鬧志鞍,春花似錦、人聲如沸方仿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至此洲,卻和暖如春厂汗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呜师。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工娶桦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汁汗。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓衷畦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親知牌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祈争,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容