基於cookie的用戶登錄狀態管理

cookie是什麼

先來花5分鐘看完這篇文章:

看完上文,相信大家對cookie已經有了一個整體的概念,我再強調一下,cookie是一個客戶端概念,它是存儲在瀏覽器本地的一小段文本(通常由服務器來生成這段文本)。

cookie的作用

如上文所說,cookie有許多作用,如會話狀態管理,個性化設置,瀏覽器行為跟蹤,客戶端數據的存儲等等。本篇文章就來講講基於cookie的用戶登錄狀態管理。

插一句哈,一般提到cookie,還會有一個叫session的傢伙和它一起出現,下篇文章我會講到它,以及兩者的區別。

cookie的產生過程

如上圖所示,客戶端攜帶賬號和密碼向服務器發起請求,服務器在校驗通過後,通過HTTP Respose Header中的Set-Cookie頭部,將一小段文本寫入客戶端瀏覽器,在以後的每個客戶端HTTP Request Header的Cookie頭部中會自動攜帶這段文本。

基於cookie的用戶登錄狀態管理

下面我基於golang和gin框架(中間件使用比較舒服)來簡單的實現一個基於cookie的用戶登錄狀態管理demo

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/login", Login)
    
    // 需要登陸保護的
    auth := r.Group("")
    auth.Use(AuthRequired())
    {
        auth.GET("/me", UserInfo)
        auth.GET("/logout", Logout)
    }

    r.Run("localhost:9000")
}

// 登陸
func Login(c *gin.Context) {
    // 為了演示方便,我直接通過url明文傳遞賬號密碼,實際生產中應該用HTTP POST在body中傳遞
    userID := c.Query("user_id")
    password := c.Query("password")

    // 用戶身份校驗(查詢數據庫)
    if userID == "007" && password == "007" {
        // 生成cookie
        expiration := time.Now()
        expiration = expiration.AddDate(0, 0, 1)
        // 實際生產中我們可以加密userID
        cookie := http.Cookie{Name: "userID", Value: userID, Expires: expiration}
        http.SetCookie(c.Writer, &cookie)

        c.JSON(http.StatusOK, gin.H{"msg": "Hello " + userID})
        return
    }
    c.JSON(http.StatusBadRequest, gin.H{"msg": "賬號或密碼錯誤"})
}

// 檢測是否登陸的中間件
func AuthRequired() gin.HandlerFunc {
    return func(c *gin.Context) {
        cookie, _ := c.Request.Cookie("userID")
        if cookie == nil {
            c.JSON(http.StatusUnauthorized, gin.H{"msg": "請先登陸"})
            c.Abort()
        }
        // 實際生產中應校驗cookie是否合法
        c.Next()
    }
}

// 查看用戶個人信息
func UserInfo(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"msg": "007的個人頁面"})
}

// 退出登陸
func Logout(c *gin.Context) {
    // 設置cookie過期
    expiration := time.Now()
    expiration = expiration.AddDate(0, 0, -1)
    cookie := http.Cookie{Name: "userID", Value: "", Expires: expiration}
    http.SetCookie(c.Writer, &cookie)

    c.JSON(http.StatusOK, gin.H{"msg": "退出成功"})
}

我們來看具體的演示流程和效果:

如下圖所示,當我們退出后再去嘗試訪問個人頁面時,會出現401沒有權限的錯誤。

上述例子的缺點

先來說說上面的demo存在的問題吧,我們的退出登錄函數本質是設置了一個過期了的cookie來覆蓋以前發送給用戶的正常cookie。

但是,這兒存在着一個重大的安全問題。如果用戶將之前未過期的正常cookie記錄下來(即本例子中的userID=007),即使調用了我們的logout接口,只要用戶自己手動輸入之前未過期的正常cookie,也是可以通過服務器的驗證。

而且,最重要的是,我們無法讓其失效,因為cookie的過期刪除機制是由瀏覽器來控制的,但是當用戶記錄了cookie中的哪段文本后,在cookie到期后,瀏覽器只能刪除存在於瀏覽器中的cookie,對用戶自己記錄下來的cookie確無能為力,也就是說這段cookie永遠有效。(後面我們會講一種叫json web token的技術,可以做到讓我們簽發的憑證自帶過期機制,而不依賴瀏覽器)

當然,有同學會說,我們可以在服務器存儲一份有效的cookie列表,在用戶退出登錄后,從有效列表中刪除對應的cookie,這種在服務端維護用戶狀態的機制本質是session的思想,我們後面會講基於session的用戶登錄狀態管理。

再來說說cookie別的缺點:

當然這個我們通過設置cookie的屬性為HttpOnly,來禁止JavaScript讀取cookie值,可以起到一定的防護作用。

當然,cookie也是有優點的,我們把用戶的登錄狀態保存在客戶端,這樣就不需要每一次去訪問數據庫來檢測用戶是否登錄,減少了系統的IO開銷。

最後

本文希望通過一個不是很完美的demo來講述基於cookie的用戶登錄狀態管理,下期我們來講講session。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

程序員需要了解的硬核知識之操作系統入門

對於程序員來說,最莫大的榮耀莫過於自己的軟件被大多數人使用了吧。

歷史文章請戳

本篇文章作為操作系統的入門文章,可能入門都算不上吧,畢竟操作系統太龐大和複雜了。本篇文章主要帶你了解一下我們常用的操作系統環境。

操作系統環境

程序中包含着運行環境這一內容,可以說 運行環境 = 操作系統 + 硬件 ,操作系統又可以被稱為軟件,它是由一系列的指令組成的。我們不介紹操作系統,我們主要來介紹一下硬件的識別。

我們肯定都玩兒過遊戲,你玩兒遊戲前需要干什麼?是不是需要先看一下自己的筆記本或者電腦是不是能肝的起遊戲?下面是一個遊戲的配置(懷念一下 wow)

圖中的主要配置如下

  • 操作系統版本:說的就是應用程序運行在何種系統環境,現在市面上主要有三種操作系統環境,Windows 、Linux 和 Unix ,一般我們玩兒的大型遊戲幾乎都是在 Windows 上運行,可以說 Windows 是遊戲的天堂。Windows 操作系統也會有區分,分為32位操作系統和64位操作系統,互不兼容。
  • 處理器:處理器指的就是 CPU,你的電腦的計算能力,通俗來講就是每秒鐘能處理的指令數,如果你的電腦覺得卡帶不起來的話,很可能就是 CPU 的計算能力不足導致的。想要加深理解,請閱讀博主的另一篇文章:

  • 顯卡:顯卡承擔圖形的輸出任務,因此又被稱為圖形處理器(Graphic Processing Unit,GPU),顯卡也非常重要,比如我之前玩兒的劍靈開五檔(其實就是圖像變得更清晰)會卡,其實就是顯卡显示不出來的原因。
  • 內存:內存即主存,就是你的應用程序在運行時能夠動態分析指令的這部分存儲空間,它的大小也能決定你電腦的運行速度,想要加深理解,請閱讀博主的另一篇文章

  • 存儲空間:存儲空間指的就是應用程序安裝所佔用的磁盤空間,由圖中可知,此遊戲的最低存儲空間必須要大於 5GB,其實我們都會遺留很大一部分用來安裝遊戲。

從程序的運行環境這一角度來考量的話,CPU 的種類是特別重要的參數,為了使程序能夠正常運行,必須滿足 CPU 所需的最低配置。

CPU 只能解釋其自身固有的語言。不同的 CPU 能解釋的機器語言的種類也是不同的。機器語言的程序稱為 本地代碼(native code),程序員用 C 等高級語言編寫的程序,僅僅是文本文件。文本文件(排除文字編碼的問題)在任何環境下都能显示和編輯。我們稱之為源代碼。通過對源代碼進行編譯,就可以得到本地代碼。下圖反映了這個過程。

Windows 操作系統克服了CPU以外的硬件差異

計算機的硬件並不僅僅是由 CPU 組成的,還包括用於存儲程序指令的數據和內存,以及通過 I/O 連接的鍵盤、显示器、硬盤、打印機等外圍設備。

在 WIndows 軟件中,鍵盤輸入、显示器輸出等並不是直接向硬件發送指令。而是通過向 Windows 發送指令實現的。因此,程序員就不用注意內存和 I/O 地址的不同構成了。Windows 操作的是硬件而不是軟件,軟件通過操作 Windows 系統可以達到控制硬件的目的。

不同操作系統的 API 差異性

接下來我們看一下操作系統的種類。同樣機型的計算機,可安裝的操作系統類型也會有多種選擇。例如:AT 兼容機除了可以安裝 Windows 之外,還可以採用 Unix 系列的 Linux 以及 FreeBSD (也是一種Unix操作系統)等多個操作系統。當然,應用軟件則必須根據不同的操作系統類型來專門開發。CPU 的類型不同,所對應機器的語言也不同,同樣的道理,操作系統的類型不同,應用程序向操作系統傳遞指令的途徑也不同

應用程序向系統傳遞指令的途徑稱為 API(Application Programming Interface)。Windows 以及 Linux 操作系統的 API,提供了任何應用程序都可以利用的函數組合。因為不同操作系統的 API 是有差異的。所以,如何要將同樣的應用程序移植到另外的操作系統,就必須要覆蓋應用所用到的 API 部分。

鍵盤輸入、鼠標輸入、显示器輸出、文件輸入和輸出等同外圍設備進行交互的功能,都是通過 API 提供的。

這也就是為什麼 Windows 應用程序不能直接移植到 Linux 操作系統上的原因,API 差異太大了。

在同類型的操作系統下,不論硬件如何,API 幾乎相同。但是,由於不同種類 CPU 的機器語言不同,因此本地代碼也不盡相同。

FreeBSD Port 幫你輕鬆使用源代碼

不知道你有沒有這個想法:“既然 CPU 不同會導致本地代碼不同,那為何不將源代碼直接發送給程序呢?”這確實是一種解決辦法,Unix 系列的 FreeBSD 操作系統就使用了這種方式。

Unix 系列操作系統 FreeBSD 中,存在一種名為 Ports 的機制。該機制能夠結合當前運行環境的硬件環境來編譯應用的源代碼,進而得到可以運行的本地代碼。如果目標應用的源代碼在硬件上找不到,Ports 就會自動使用 FTP 連接到相應站點下載代碼。

全球有很多站點都提供適用於 FreeBSD 的應用源代碼。通過使用 Ports 可以利用的程序源代碼,大約有 16000 種。根據不同的領域進行分類,可以隨時使用。

FreeBSD 上應用的源代碼,大部分是用 C 語言來標註的,C 編譯器可以結合 FreeBSD 的運行環境來生成合適的本地代碼。

FTP( File Transfer Protocol) 是連接到互聯網上的計算機之間的傳送文件的協議。

可以使用虛擬機獲取其他環境

即使不通過應用程序的移植,在同一個操作系統上仍然可以使用其他的操作系統,那就是使用 虛擬機軟件。虛擬機(Virtual Machine)指通過軟件的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。在實體計算機中能夠完成的工作在虛擬機中都能夠實現。

提供相同運行環境的 Java 虛擬機

總算是提到大 Java 了, Java 大法好,除了虛擬機的方法之外,還有一種方法能夠提供不依賴於特定硬件和操作系統的程序運行環境,那就是 Java。

大家說的 Java 其實有兩層意思,一種是作為編程語言的 Java;一種是作為程序運行環境的 Java。Java 與其他語言相同,都是通過源代碼編譯后運行的。不過,編譯後生成的不是特定 CPU 使用的本地代碼,而是名為字節代碼 的程序。直接代碼的運行環境就稱為 Java 虛擬機(Java Virtual Machine)。Java 虛擬機是一邊把 Java 字節代碼逐一轉換為本地代碼一邊在運行着。

程序運行時,將編譯后的字節代碼轉換為本地代碼,這樣的操作看上去有些迂迴,但由此可以實現相同的字節碼可以在不同的操作系統環境下運行。

想象一下,你開發完成的應用部署到 Linux 環境下,是不是什麼都不用管?

Windows 有專門的 Windows 虛擬機,Macintosh 有 Macintosh 專門的虛擬機。從操作系統來看,Java虛擬機就是一個應用,從運行環境上來看,Java 虛擬機就是運行環境。

BIOS 和引導

最後對一些比較基礎的部分做一些補充說明。程序的運行環境,存在着名為 BIOS(Basic Input/Output System)的系統。BIOS 存儲在 ROM 中,是預先內置在計算機主機內部的程序。BIOS 除了鍵盤、磁盤和顯卡等基本控制外,還有引導程序的功能。引導程序是存儲在啟動驅動器啟示區域的小程序。操作系統的啟動驅動器一般硬盤。不過有時也可能是 CD-ROM 或軟盤。

電腦開機后,BIOS 會確認硬件是否正常運行,沒有異常的話會直接啟動引導程序。引導程序的功能是把在硬盤等記錄的 OS 加載到內存中運行。雖然啟動應用是 OS 的功能,但 OS 不能啟動自己,是通過引導程序來啟動的。

文章參考:

《程序是怎樣跑起來的》第七章

關注公眾號後台回復 191106 即可獲得《程序是怎樣跑起來的》电子書

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

研究:熱浪恐同時襲擊大糧倉 造成食物短缺

摘錄自2019年12月10日中央社報導

德國波茨坦氣候影響研究中心(Potsdam Institute for Climate Impact Research)氣候學家、也在荷蘭阿姆斯特丹自由大學(VU University Amsterdam)擔任副教授的庫姆(Dim Coumou)共同執筆在「自然氣候變遷」(Nature Climate Change)期刊,該報告警告,氣候變遷可能導致全球各地出現更強烈的熱浪,並在同一時間襲擊各大糧倉,造成食物短缺,引發動亂。

庫姆表示,世界一部分地區的農作物因氣候災難等原因歉收,原本就會抵銷其他收成正常或豐收地區增加的交易量;但高懸地球上空的強烈噴射氣流風,加上氣候導致氣溫更加升高,可能會在同時間襲來,威脅到多個糧倉的作物。

最無法抵擋這種熱浪的地區包括北美西部、西歐、西俄羅斯和烏克蘭,這裡種植的小麥、玉米、大豆、稻米產量占全球主食約1/4。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

台灣藝術家黃瑞芳 獲吐瓦魯任命「氣候緊急大使」

整理:彭瑞祥(環境資訊中心記者)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

李克強:加快建設新能源汽車充電設施

國務院總理李克強作政府工作報告時表示,今後要加快建設城市停車場和新能源汽車充電設施,提高清潔能源比重。

李克強指出,重拳治理大氣霧霾和水污染。著力抓好減少燃煤排放和機動車排放。加強煤炭清潔高效利用,推進以電代煤、以氣代煤。全面實施燃煤電廠超低排放和節能改造,加快淘汰不符合強制性標準的燃煤鍋爐,增加天然氣供應,完善風能、太陽能、生物質能等發展扶持政策,提高清潔能源比重,鼓勵秸稈資源化利用,減少直接焚燒。

全面推廣車用燃油國五標準,淘汰黃標車和老舊車380萬輛,在重點區域實行大氣污染聯防聯控。

增強消費拉動經濟增長的基礎作用。適應消費升級趨勢,破除政策障礙,優化消費環境,維護消費者權益。支持發展養老、健康、家政、教育培訓、文化體育等服務消費。壯大網路資訊、智慧家居、個性時尚等新興消費。鼓勵線上線下互動,推動實體商業創新轉型。完善物流配送網路,促進快遞業健康發展。活躍二手車市場,加快建設城市停車場和新能源汽車充電設施。在全國開展消費金融公司試點,鼓勵金融機構創新消費信貸產品。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

京津冀將規劃一體化電動汽車公共充電網絡

中國京津冀等三地於7月30日簽署了協議,將共同開發京津冀區域的一體化電動汽車公共充電網絡,目標在2020年完工實施。此案將涵蓋電動車發展以及充電設備標準的設立、充電設備之量化,相關國家政策也會陸續制定提出。

中國大陸的電動車產業發展迅速,在「十二五」相關計畫之中就曾規劃2015年底要在全中國安裝40萬個電動車充電樁、2000個充換電站,但此一目標並沒有達成。究其原因,除了新能源電動車仍在發展階段之外,充電設備的標準尚未統一、社會資本進入難、營利模式單一等,都是使充電設備安裝計畫無法落實的原因。

據中國媒體《經濟參考報》指出,在京津冀三地簽署共同發展合約後,國家級的電動車充電標準文件《電動汽車充電基礎設施指南》以及《充電基礎設施指導意見》等規章也會陸續提出,這規章將具體規劃充電設備的數量:到2020年時,國內充換電站的數量目標1.2萬個,充電樁450萬個;此外,電動車與充電設施的比例也預計將從現在的4:1提升到1:1左右。在如此龐大的數量規劃下,中國充電市場的規模預計會超過人民幣1000億元。

不過,市場規模擴張的前提仍是充電設施建設能如期推行,而充電設施之建設推行則仰賴技術標準化,例如充電插槽、通訊協議等,以確保不同品牌的電動車都能一體適用。

而在盈利與資本進入困難等問題方面,政策保障將可為市場資本創造可靠的入口,進而加強獲利幅度。

中國國內的充電產業有越來越多國企、民企接連投入,例如青島特來電公司計畫到2015年底在全國40個城市建設7至10萬個充電設備,投資超過人民幣10億元,希望三年內能占全國市場50%以上。具有外資背景的富電科技公司也在今年一月在北京華貿中心落成中國首個核心商圈光伏智能充電站。車用充電業界也開始有創業者投入。

(照片來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

工信部將調查新能源車騙補 違規或將取消資質

日前,有媒體報導稱,部分電動車廠和租賃運營公司,以迴圈使用電池組裝配整車方式,以少充多,騙取政府對新能源汽車的大量補貼。高額補貼不僅令一些原本沒有新能源技術儲備的汽車生產企業爭先恐後投入“電動化”,還在銷售環節進行算計。目前工信部等部門已經啟動調查,針對騙取新能源汽車補貼的企業或將面臨吊銷生產資質的嚴厲處罰。

對此,一位從事動力電池專家王敏(化名)在接受採訪時表示:“這種現象的確存在,靠不正當手法獲得補貼的企業多為小型企業或改裝廠。”
  
王敏對此解釋稱,一些車企騙取新能源補貼的方式主要有兩種,一是整車企業全資或參股汽車租賃公司,通過“自產自銷”的方式,拿到國家和地方對電動車的補貼;租賃公司購買的車輛並沒有投入運營,但是這些車輛在上牌之後,補貼已經到手。在兩類細分行業,一類是用於共用、租賃的乘用車,一類是用於城市物流的運營類車輛,都有騙補的情況發生。

另一種方式,則是由一家汽車租賃運營公司主導,一邊採購整車企業,一邊與電池企業合作,通過“多採購整車,少採購電池”的方式,從中獲取補貼。這種方式是通過協力廠商運營公司來暗箱操作,有些車輛運營公司,一手牽著產銷規模甚小的電動車生產企業,一手與動力電池生產企業合作,通過將兩類公司的產品捏合在一起組成電動車,獲得政府補貼,很多車輛“空有牌照”,並沒有真正上路運營。

根據2015年12月財政部發佈的《關於2016~2020年新能源汽車推廣應用財政支持政策的通知》,純電動、插電式混合動力(含增程式)等專用車、貨車推廣應用補助標準:按電池容量每千瓦時補助1800元。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

SpringBoot 源碼解析 (一)—– SpringBoot核心原理入門

Spring Boot 概述

Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.

上面是引自官網的一段話,大概是說: Spring Boot 是所有基於 Spring 開發的項目的起點。Spring Boot 的設計是為了讓你盡可能快的跑起來 Spring 應用程序並且盡可能減少你的配置文件。

什麼是 Spring Boot

  • 它使用 “習慣優於配置” (項目中存在大量的配置,此外還內置一個習慣性的配置,讓你無須手動配置)的理念讓你的項目快速運行起來。
  • 它並不是什麼新的框架,而是默認配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一樣,Spring Boot 整合了所有框架

使用 Spring Boot 有什麼好處

回顧我們之前的 SSM 項目,搭建過程還是比較繁瑣的,需要:

  • 1)配置 web.xml,加載 spring 和 spring mvc
  • 2)配置數據庫連接、配置日誌文件
  • 3)配置家在配置文件的讀取,開啟註解
  • 4)配置mapper文件
  • …..

而使用 Spring Boot 來開發項目則只需要非常少的幾個配置就可以搭建起來一個 Web 項目,並且利用 IDEA 可以自動生成生成

  • 划重點:簡單、快速、方便地搭建項目;對主流開發框架的無配置集成;極大提高了開發、部署效率。

Spring Boot HelloWorld

導入依賴spring boot相關的依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.chenhao</groupId>
    <artifactId>springboot</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

編寫主程序

/**
 * @SpringBootApplication來標註一個主程序類,說明這是一個SpringBoot應用
 */ @SpringBootApplication public class HelloWorldMainApplication {

    public static void main(String[] args) {
        //Spring應用啟動
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

編寫Controller、Service

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "Hello world";
    }
}

運行主程序測試

使用maven打包命令將其打包成jar包后,直接使用命令:

java -jar xxx.jar

Hello World探究

POM文件

父項目

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
</parent>

其父項目是

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

該父項目是真正管理Spring Boot應用裏面的所有依賴的版本:Spring Boot的版本仲裁中心,所以以後導入的依賴默認是不需要版本號。如下

還有很多版本號沒有截圖出來

啟動器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter : spring boot場景啟動器;幫助導入web模塊正常運行所依賴的組件;

​ Spring Boot將所有的功能場景抽取出來,做成一個個的starter(啟動器),只需要在項目中引入這些starter,那麼相關的場景的所有依賴都會導入進項目中。要用什麼功能就導入什麼場景的啟動器。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>

添加了 spring-boot-starter-web 依賴,會自動添加 Tomcat 和 Spring MVC 的依賴

spring-boot-starter-web中又引入了spring-boot-starter-tomcat

主程序類(主入口類)

@SpringBootApplication public class HelloWorldMainApplication {

    public static void main(String[] args) {
        //Spring應用啟動
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

@SpringBootApplication

  • Spring Boot應用標註在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用。

註解定義如下:

@SpringBootConfiguration @EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

@SpringBootConfiguration

  • Spring Boot的配置類
  • 標註在某個類上,表示這是一個Spring Boot的配置類

註解定義如下:

@Configuration public @interface SpringBootConfiguration {}

其實就是一個Configuration配置類,意思是HelloWorldMainApplication最終會被註冊到Spring容器中

@EnableAutoConfiguration

  • 開啟自動配置功能
  • 以前使用Spring需要配置的信息,Spring Boot幫助自動配置;
  • @EnableAutoConfiguration通知SpringBoot開啟自動配置功能,這樣自動配置才能生效。

註解定義如下:

@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}

@AutoConfigurationPackage

  • 自動配置包註解
@Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage {}

@Import(AutoConfigurationPackages.Registrar.class):默認將主配置類(
@SpringBootApplication)所在的包及其子包裏面的所有組件掃描到Spring容器中。如下

@Order(Ordered.HIGHEST_PRECEDENCE)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata,
            BeanDefinitionRegistry registry) {
          //默認將會掃描@SpringBootApplication標註的主配置類所在的包及其子包下所有組件
        register(registry, new PackageImport(metadata).getPackageName());
    }

    @Override
    public Set<Object> determineImports(AnnotationMetadata metadata) {
        return Collections.<Object>singleton(new PackageImport(metadata));
    }
}

@Import(EnableAutoConfigurationImportSelector.class)

EnableAutoConfigurationImportSelector: 導入哪些組件的選擇器,將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中。

 1 //EnableAutoConfigurationImportSelector的父類:AutoConfigurationImportSelector
 2 @Override
 3 public String[] selectImports(AnnotationMetadata annotationMetadata) {
 4     if (!isEnabled(annotationMetadata)) {
 5         return NO_IMPORTS;
 6     }
 7     try {
 8         AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
 9             .loadMetadata(this.beanClassLoader);
10         AnnotationAttributes attributes = getAttributes(annotationMetadata);
11         List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); 12         configurations = removeDuplicates(configurations);
13         configurations = sort(configurations, autoConfigurationMetadata);
14         Set<String> exclusions = getExclusions(annotationMetadata, attributes);
15         checkExcludedClasses(configurations, exclusions);
16         configurations.removeAll(exclusions);
17         configurations = filter(configurations, autoConfigurationMetadata);
18         fireAutoConfigurationImportEvents(configurations, exclusions);
19         return configurations.toArray(new String[configurations.size()]);
20     }
21     catch (IOException ex) {
22         throw new IllegalStateException(ex);
23     }
24 }

我們主要看第11行List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);會給容器中注入眾多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,並配置好這些組件。我們跟進去看看

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
            AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
        getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
    //...
    return configurations;
}

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        //從類路徑的META-INF/spring.factories中加載所有默認的自動配置類
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                                 ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            //獲取EnableAutoConfiguration指定的所有值,也就是EnableAutoConfiguration.class的值
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

SpringBoot啟動的時候從類路徑下的
META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,並將這些值作為自動配置類導入到容器中,自動配置類就會生效,最後完成自動配置工作。EnableAutoConfiguration默認在spring-boot-autoconfigure這個包中,如下圖

最終有96個自動配置類被加載並註冊進Spring容器中

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-xxx.jar中。在這些自動配置類中會通過@ConditionalOnClass等條件註解判斷是否導入了某些依賴包,從而通過@Bean註冊相應的對象進行自動配置。後面我們會有單獨文章講自動配置的內容

 

 

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

軟件測試(開發)工程師的核心競爭力是什麼?

1. 測試行業正在發生變化

在互聯網新趨勢和新要求的變革推動下,測試行業也在不知不覺中發生着非常大的改變,從早些年的懵懂發展,大家摸着石頭過河,到大多高校設立軟件測試專業,再到近幾年各種測試培訓盛行。如果說早期軟件測試行業還是一個風口,隨着不斷地轉行人員以及畢業的大學生瘋狂地湧入軟件測試行業,目前軟件測試行業“缺口”已經基本飽和,最基礎的功能測試的崗位需求已經越來越少了。測試的進入門檻,也從真正零基礎,到現在的要求具備專業的計算機專業能力(包括不限於編程能力),軟件測試在企業的受重視程度,特別是互聯網行業,也從可有可無,到不可或缺。

2. 行業人員分佈呈現兩極勢態

測試行業不斷髮展,行業已經呈現出嚴重的兩極分化勢態,一邊是資深的測試大牛,屬於全棧複合型人才,但這一類行業中人員占的比例較為稀少。一是由於行業原因,代碼能力強,有架構經驗的人員一般都在開發部門;二是要求高,資深測試開發工程師不僅要精通測試相關的技能,還要會前端設計,服務端開發等等,幾乎是全棧工程師;而做程序的人員一般精通一點或是幾點的較多,從前到后全都能上的越來越少。另一邊是測試小白,即便是有些在測試行業中已經摸爬滾打了幾年,但仍然有很多測試人員還是停留在只會業務功能測試的這個階段。而針對這類型的測試從業人員,除了一些安於現狀的除外,大多數人其實都還是想好好學習,想進步的只是不知道學習方向,或者學習不得其法。

 

3. 企業需要更多高端綜合人才

但不管是屬於哪一種,對於企業而言,想快速發展自己的業務,必須有一個強大的測試團隊來保證質量,通過一系列的質量保障手段,如引入CI,CD以及其他的手段來促進項目的快速迭代與交付。這就要求相關的測試工程師要能從多方面來考慮設計和解決問題,不僅要考慮項目的實施成本,還要考慮參与的測試,開發,產品甚至用戶等人員,同時要與公司發展的前景及方向相切合,並能很好地為之服務。提供這類能力的測試人才在公司都是較為吃香的,每年的找工作季節也就那麼幾個人會進入人才市場流通,而且很快就能找到工作,這也是每個測試人員的努力方向,只有具備了相應的價值實力,才有資格向企業要求你期望的回報

 

4.企業招人與求職者供求總是難以匹配

很多同學抱怨,企業招人為什麼要求越來越高,除了學歷(本科以上),還要求年齡(35內),以及項目經驗,太難太難 。其實,企業也挺苦惱的:招幾個適合的人選太難了 ,這就是所謂的「供需關係」失調了 。大批測試從業者找不到工作,大量企業找不到適合的人選 。

而造成不匹配、供需關係失調的最核心的問題歸根到底還是聚焦於能力要求不匹配

那麼測試人員核心技能或者說測試人員的核心競爭力到底有哪些? 測試人員應該思考這個問題、企業用人單位也應該要思考需要什麼樣的測試人員?相信大家面試求職時或多或少都會有這種感覺,企業在招聘時,要求會各種框架、各種編程語言、各種工具的使用。那在我們學會了測試技術、測試工具的使用,最後核心競爭力到底聚焦在哪些方面?

 

5. 你的核心競爭力是什麼?

提到在軟件測試這個行業,你的核心競爭力是什麼?這是個非常有意思的話題,就像我們經常說的“團隊中的價值問題”,你經常看到測試人員自己在想,我們的價值在哪裡、是什麼?但我們很少看到軟件的開發人員或者架構師,或者運維團隊去問這樣一個問題,要去找自己的價值。這是因為測試人員對這個價值本身是不太確定的,那麼這個價值本身不確定,就會帶來的一系列的問題。

在早期軟件行業中,會發現存在一個普遍的現象,有些大學的本科,或者研究生畢業,他們去面試工作的時候就會發現,面試下來的是代碼能力可能不是太好,這種情況下公司會問你願不願意去做測試?但隨着現在這個時代的變革,現在的軟件測試工程師,他的知識面,以及他需要掌握的內容已經遠遠超過了之前,可以說他的知識面是遠遠超過開發的,比如在一些技術的面上,以及對產品的理解上。

那麼這種情況下,我們再去提一個優秀的軟件測試工程師的核心價值,我們可以很自信地說,測試工程師是一個不可被替代的,並且是一個專業細分化的領域。像早年的時候,我們談到測試,就是軟件測試,沒有細分市場,但現在你去談測試,測試現在的領域太多了,除了傳統意義上的,基於業務領域的測試,然後還有測試開發。

 

6. 企業為什麼不願給你開高薪?

經常會有從業者諮詢我:“怎麼轉行到測試開發崗位?測試開發崗位怎麼入手?測試開發崗位到底是做什麼的?需要掌握哪些知識 ?”

其實啊,問這些問題的時候,你可能就不太適合此崗位。或者你只是聽說測試開發工資高、奔着薪資來的,也許你完全不適合 。

正如在之前介紹測試開發的文章 : 中提到過隨着現在測試開發崗在各個公司的設定,且測試開發崗一般會頂着“薪資高”的頭銜(至少在測試這個領域,測試開發的薪資普遍都要比業務手工測試高上許多),越來越多的手工測試人員,都急於想轉崗到測試開發,但需不知往往只是看到了測試開發崗的薪資高,但卻忽略了最重要的一點(那些拿高薪的人付出的努力同樣也是比你多)!我們不妨先看看下面幾則同行人的心聲。(是否曾及何時,正在讀文的你也是這麼認為的?)

  • 很多QQ群、微信群的測試同行經常在抱怨,平日測試工作乾的很苦逼,活沒少干,加班也沒少加,但工資、獎金卻比其它崗(比如開發)要拿的少。
  • 測試工作做了好幾年了,但去外面求職的時候,屢屢碰壁,總得拿不到自己滿意的薪資Offer。
  • 認為測試崗位沒有“錢”途、工作內容做的沒有意義,不如趁早轉開發、產品。

 

之所以行業中會有許多從業人員有上述幾點心聲,最核心的問題點還是認為自己工作乾的活所得到的薪資待遇和自己希望得到的回報無法相匹配上。正如馬雲之前說過,企業員工離職的原因,歸根結底只有兩個:1、錢沒給夠。2、平台無法施展才能,覺得委屈了

 

我相信絕大多數人,都是“倒”在了第一點原因上。那為什麼企業開的薪資就總是無法達到“大多數從業人員”的要求呢?難道企業開不起薪資?但身在同一個公司,為何又存在其它崗位“測試開發”、“開發”薪資高這一說法?這顯然並不是企業開不起薪資,而是企業認為TA所能幫助企業帶來的價值只值這麼多。

 

7. 對高薪崗位的誤解

不論是“測試開發”或者是“開發”,頂着“薪資高”這一普遍說法,其中大多數對這個說法還是存在誤解的,並不是所謂的“崗位薪資論”,認為做了這個崗位,就一定有高的薪資,試想一下,同樣有很多開發人員,薪資不見的就比測試牛人高。而那些之所以有着“高薪崗位的人”,是因為他們所具備的能力以及能為公司帶來的價值也是越高的。因此,`高薪!= 崗位`,而**應該是高薪要等於與之匹配的能力和能為企業帶來的等同價值**。

這一觀點,恰好也回應了上述所提到的,現在越來越多的手工測試人員都想轉行測試開發。但轉行到測試開發並不是關鍵,如果能力沒有轉變,只是崗位的頭銜轉變了,即便給你安排一個測試開發或開發的頭銜,但你的能力還只是在干一些不痛不癢的工作,那麼企業仍然是不可能會為你買單的。之所有測試開發有着高薪的說法,是由於現在企業對測試開發的綜合能力已經不亞於開發,他們的技術能力和解決業務問題的能力在某些方面甚至要強於開發。因此企業肯為這些人付出高薪的回報。

我想對那些想轉崗或者埋怨自己工資低的從業人員,奉切一句:轉崗不是最終目的,提升自身能力才是根本。如果你的能力足夠出眾,能你團隊、企業帶來的價值已經超出測試所需要提供的,即便只是頂着業務測試的頭銜,我相信,企業仍然肯為你付出相應的高回報。

 

8. 如何打造個人核心競爭力

那些想拿高薪或者是想轉崗成為測試開發的同學,需要做的應該是要不斷提升自身能力和價值點,這些價值點立足在團隊、公司無非就是兩類能力:1.綜合技術能力、2.幫助產品業務解決問題的能力。

1. 提升綜合技術能力,說到技術,第一關:開發語言(不管是Python,還是Java,真的無所謂,先搞懂一個再說) 。

先能獨立開發一套可用的東西。至於你寫的代碼高性能、高可用,先可以放放 。但至少得通過擼代碼,實現業務方需求吧 ?

很多測試同學問,到底學Python還是學Java ?半年後,你去問他學的咋樣的,他可能還在那糾結:“到底是學Python還是學Java ?”的問題,根本就沒開始學。

“學習這事,道理都懂,就是缺行動。”,雖然這句話,看起來像廢話,但事實如此。

很多時候,看着那些:“知道自己能力有問題、想學點啥東西、到處諮詢他人應該學啥、得到答案后、依然半年沒行動”的(別笑,看文章的你,也許就是)。

否則,怎麼可能會出現:在市場上,想招一些靠譜的從業者,那麼難 。看到很多公司,耗時幾個月招不到適合的人,雖然這裡有公司的原因,但求職者能力不符合,是很大一部分原因 。

行業在發展,一直守着“自己那點業務知識、測試流程、幾年前的工具”的同學,太多 。借用之前的觀點,定期出來面試聊聊,你會發現,你根本找不到合適的工作 。

如果還在糾結學啥開發語言的,別糾結,此刻、現在,開始,學Python 。

Python易入手,簡單,好用 。而且,如果不做測試開發,通過Python也可以玩轉各種自動化測試。

 

OK ,如上內容,是對測試(開發)工程師核心競爭力的一些看法,摘自本人公眾號中的一部分篇幅內容,僅代表個人觀點 。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

取道對歐輸送天然氣 俄烏達成初步協議

摘錄自2019年12月20日中央社報導

俄羅斯天然氣工業公司2019年向歐洲供應2008億立方公尺的天然氣,其中有約40%是借道烏克蘭運送,讓烏克蘭每年賺得約30億美元(約新台幣904億元)的過境費,此輸送合約將於年底到期,但自莫斯科2014年併吞克里米亞並支持烏克蘭東部的分離主義分子叛亂活動後,雙方關係急轉直下。

俄羅斯與烏克蘭歷經數個月的艱難談判,在即將到來的新年截止期限前,簽署取道烏克蘭將俄羅斯天然氣運往歐洲的初步協議。

俄羅斯通訊社引述俄羅斯天然氣工業公司(Gazprom)發言人說法報導:「俄羅斯與烏克蘭已經簽署諒解備忘錄。」但沒有提供合約細節。法新社報導,俄羅斯能源部長諾瓦克(Alexander Novak)說,這是5年合約,將在月底前簽署。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益