Java番外雜談之每天掃的二維碼你瞭解它內含的信息嗎

⭐️二維碼發展簡史⭐️

條形碼的誕生

在理解二維碼技術原理之前,我們先來簡單看下它是怎麼發展起來的。早在1948年,伯納德·塞爾沃還是費城煤氣科技學院的一名研究生,在一次偶然的機會他得知當地的一傢超市的老板想要院長幫忙設計一種可以掃描商品價格的裝置,用以提高超市內貨品銷售的效率。因為超市裡的收銀員在結算貨品的時候每次都需要手動輸入架構,超時客流量達的時候,收銀員結算效率十分低下。但是院長覺得這是一件非常不容易做到的事情。

然而伯納德·塞爾沃與他的朋友約瑟夫·伍德蘭德卻覺得這是一個巨大的商機,決定要好好設計做出個可以商用的產品出來。在嘗試瞭紫外線照射石墨發光的方案、盲點系統以及點線符號系統等方案之後,由於當時的技術限制,都沒有得到廣泛的應用。

轉眼時間來到瞭20世紀60年代,伍德蘭德始終沒有放棄當年那麼沒有實現商業化應用的金點子。此時他已經是IBM的一位工程師瞭,在公司期間,他不斷闡述自己關於條形碼的技術實現想法,同事不斷強調條形碼的商業價值。與此同時,激光以及計算機已經開始應用起來,條形碼實現的技術基礎已經完成。大概在1969年,伍德蘭德參與到IBM公司投入的由喬治·勞雷爾負責的超市掃描儀和標簽研究項目組中,經過幾年的潛心研究,IBM終於推出瞭可識別的條形碼。

在1974年6月26日的這一天,世界上第一個條形碼掃描器被安裝在俄亥俄州特洛伊的馬什超市裡。第一件被掃描的商品是10包箭牌的多汁水果味口香糖,這包口香糖如今已被美國歷史博物館收藏 。而後,條形碼被廣泛應用於商品、書籍、郵政等系統中,極大地提升瞭業務運行效率。

我們可以看得出來推動技術進步的往往都是現實生活中的業務需求。但是隨著條形碼的廣泛用,它的不足之處逐漸顯現出來,

1、條形碼的數據表示內容非常有限,隻能表示數字以及字母,無法表示更多的其他字符信息;

2、條形碼表示的數據量也非常有限,如果想要包含更多的數據隻能不斷的進行水平拉伸,導致條形碼越來越大,不利於商用;

3、條形碼如果出現變形或者條形丟失就會造成數據的不可獲取,影響業務的正常使用;

正因為條形碼存在著這樣以及那樣的不足之處,人們對於出現有一種可以表達更多信息的的期望與日俱增。

二維碼的橫空出世

雖然二維碼的應用在中國大放異彩,但是實際上它是日本人發明的。日本 Denso Wave 公司(日本電裝株式會社(Denso Corporation)旗下的子公司)的騰弘原是二維碼的發明者。在公司的業務中需要對汽車的零部件標註屬性信息,包括產地、生產時間、生產批次等等信息,傳統的條形碼無法滿足大量信息的標註,因此需要一種涵蓋更加多信息的標註方式。

騰弘原想到既然一維的條形碼沒辦法表達更多消息,那麼是不是可以增加維度來讓其表示更多的信息,這就是二維碼的思考雛形。但是緊接著又遇到瞭如何讓這個二維碼能夠實現高速的讀取。技術攻關小組利用正方形的四個角中的三個來作為定位符,然後通過剩餘的一個角來判斷實際二維碼的方向,從而達到無論是從什麼方向進行掃描,都不影響二維碼內容的讀取。

經過幾年的反復測試,騰弘原的攻關小組終於攻克技術難關,這個小小的方塊二維碼在信息存儲上相比條形碼提升瞭300倍,而在二維碼的識別速度上提升瞭10倍。在1994年,DENSO WAVE公司面向全日本開始推廣二維碼技術,並將其命名為“Quick Response Code”。時至今日,二維碼已經在全世界范圍內得到廣泛應用,尤其是在中國可以說是發揮到瞭極致。

技術原理

在網上我們可以輕松找到在線制作二維碼的工具網站,這些網站中,可以轉化為二維碼的信息包含瞭,文本、URL、圖片以及音視頻等等。由此可知二維碼的本質實際就是一種數據信息的表現方式。

二維碼實際上是由於白色方塊以及黑色方塊組成,實際上就是對應計算機世界中的0-1二進制語言。其中黑色小方塊代表1,白色小方塊代表0。因此實際上黑白方塊的二維碼組合在一起就是0-1組成的信息組合。而0-1組成的二進制數據實現對於信息的編碼,也是計算機可以看懂的語言。

(圖片來源於網絡)

手機進行二維碼掃描的時候,由於二維碼是黑白相間的二位點陣,通過光的反射進入手機攝像頭時候,手機中的CMOS感光元件將接收到的光信號轉化為電信號,而二維碼代表的0-1組合實際在手機中就是對應的高低電位,最終解析為二維碼對應的標註信息。

⭐️典型應用—掃碼登錄⭐️

掃碼登錄是二維碼非常典型的應用場景,以前我們登錄網站需要輸入用戶名以及密碼,有時候還為一時想不起來密碼是多少而非常著急。自從有瞭二維碼登錄之後,隻要拿出手機掃一掃web端的二維碼就可以完成登錄操作非常方便,那我們就來分析下二維碼掃描登錄的技術原理是怎樣的吧。

對於登錄這件事情來說,其本質實際包含瞭兩件事情,第一件事情是告訴平臺你是誰,第二件事情是向平臺證明你就是你不是別人。那傳統的用戶名以及密碼登錄的方式,用戶名實際就是告訴平臺你是誰,而密碼就是向平臺證明你就是你。那麼放在二維碼掃碼登錄的場景下,實際也是需要完成這兩件事情的支撐。下面我們分析下客戶端掃碼登錄掃碼登錄的實現機制。

客戶端掃碼登錄

我們在客戶端登錄的時候,需要輸入用戶名以及密碼信息,此後的客戶端與服務端的交互過程大致如下所示:

1、首先用戶在客戶端輸入用戶名以及密碼進行登錄操作;

2、客戶端攜帶用戶名、密碼以及設備信息向服務端發起登錄請求;

3、服務端校驗用戶名以及密碼信息,同時將賬號信息與設備信息進行綁定,並返回token信息;

4、客戶端保存token信息;

5、再次登錄的時候不需要再傳遞用戶名以及密碼,將token信息以及設備信息傳遞給服務端,服務端校驗token以及設備信息;

這裡的token信息實際就是代替瞭賬號以及密碼信息,可以理解為一種數據結構存儲瞭賬號、設備等信息,用以後期的服務端校驗。

上面所說的是客戶端登錄的大致步驟,它是客戶端掃碼登錄的基礎,接下來我們再看下掃碼登錄的大致業務流程,如下所示:

在這個過程中最重要的是生成臨時的token,這個臨時token實際就是一種登錄的憑證,並且與二維碼一一對應,用過一次就會失效。那為什麼要有這個臨時的token呢?實際是為瞭解決掃碼這個動作與登錄的連接關系,系統需要確認二維碼是被客戶端掃描後進行的登錄操作。

微信第三方掃碼登錄

所謂微信第三方掃碼登錄指的是登錄CSDN,但是使用的是微信賬號進行登錄,實際上就是用微信的賬號信息來當做CSDN賬號信息使用。它上上述的客戶端登錄的最大不同就在於多瞭和微信開放平臺的交互。通過從微信開放平臺獲取用戶的頭像、用戶名等信息。

⭐️總結⭐️

本文主要結合瞭二維碼的技術發展歷程,闡述瞭二維碼的技術原理,同時對二維碼典型的應用場景進行瞭技術原理的分析,相信通過本文大傢對於二維碼的原理有瞭更加深刻的理解。

到此這篇關於Java番外雜談之每天掃的二維碼你瞭解它內含的信息嗎的文章就介紹到這瞭,更多相關Java 二維碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: