現在買東西真的是太方便了
科技始終來自於惰性真的沒錯~~~好像怪怪的~~
因為物流的進步以及無遠弗屆網路商城,現在不用出門也可以買到自己喜歡的東西
無論是生活上用的,還是個人運動類的產品
網路商城幾乎都可以買到~
尤其最近很常逛momo,真的是感覺非常方便啊
有一次買到瑕疵品,他們物流很快就收走,換新的給我真的很不錯
【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)是我在網路上閒逛時,猛然看到的產品
簡直讓我非常驚艷!
這類型的產品其實本來我就有在找,不過一直遇不到打折的好時機
現在終於等到了,而且廠商也正好有貨
不然等下次折扣,不知道等到什麼時候
所以我個人對【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)的評比如下
外觀質感:★★★★
使用爽感:★★★★☆
性能價格:★★★★☆
詳細介紹如下~參考一下吧
完整產品說明
品牌名稱
對象與族群
- 大人
類型
- 外野
尺寸
- Free
功能
- 人體工學型
商品規格
- 商品品牌:Louisville Slugger
型號:LB17012N142
非常推薦【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)給大家
↓↓↓【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)限量特惠的優惠按鈕↓↓↓
↓↓↓更多優質好物推薦↓↓↓
標籤註解:
PTT鄉民【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)限量,團購,限時,週年慶,禮物,優惠,【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)特價,開箱,比價,活動,好評,推薦
01網友【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)哪裡便宜,採購,優缺點,試用【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142),好用,CP值,經驗,好康,集購,下殺,免比價,去哪買?,
名人推薦【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)介紹,部落客,排行,【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142),體驗,精選,限定,折扣,折價卷
↓↓↓【LOUISVILLE】Louisville Slugger LS 金剛棒壘手套(LB17012N142)限量特惠的優惠按鈕↓↓↓
熱點新聞搶先報
作者|不學無數的程式設計師 https://my.oschina.net/u/4030990/blog/3136476 在了解這三個概念之前我們先要了解HTTP是無狀態的Web伺服器,什麼是無狀態呢?就像上面夏洛特煩惱中經典的一幕對話一樣,一次對話完成後下一次對話完全不知道上一次對話發生了什麼。如果在Web伺服器中只是用來管理靜態文件還好說,對方是誰並不重要,把文件從磁碟中讀取出來發出去即可。但是隨著網絡的不斷發展,比如電商中的購物車只有記住了用戶的身份才能夠執行接下來的一系列動作。所以此時就需要我們無狀態的伺服器記住一些事情。 那麼Web伺服器是如何記住一些事情呢?既然Web伺服器記不住東西,那麼我們就在外部想辦法記住,相當於伺服器給每個客戶端都貼上了一個小紙條。上面記錄了伺服器給我們返回的一些信息。然後伺服器看到這張小紙條就知道我們是誰了。那麼Cookie是誰產生的呢?Cookies是由伺服器產生的。接下來我們描述一下Cookie產生的過程 瀏覽器第一次訪問服務端時,伺服器此時肯定不知道他的身份,所以創建一個獨特的身份標識數據,格式為key=value,放入到Set-Cookie欄位里,隨著響應報文發給瀏覽器。 瀏覽器看到有Set-Cookie欄位以後就知道這是伺服器給的身份標識,於是就保存起來,下次請求時會自動將此key=value值放入到Cookie欄位中發給服務端。 服務端收到請求報文後,發現Cookie欄位中有值,就能根據此值識別用戶的身份然後提供個性化的服務。 ... 接下來我們用代碼演示一下伺服器是如何生成,我們自己搭建一個後臺伺服器,這裡我用的是SpringBoot搭建的,並且寫入SpringMVC的代碼如下。 @RequestMapping("/testCookies") public String cookies(HttpServletResponse response){ response.addCookie(new Cookie("testUser","xxxx")); return "cookies"; } 項目啟動以後我們輸入路徑http://localhost:8005/testCookies,然後查看發的請求。可以看到下面那張圖使我們首次訪問伺服器時發送的請求,可以看到伺服器返回的響應中有Set-Cookie欄位。而裡面的key=value值正是我們伺服器中設置的值。 ... 接下來我們再次刷新這個頁面可以看到在請求體中已經設置了Cookie欄位,並且將我們的值也帶過去了。這樣伺服器就能夠根據Cookie中的值記住我們的信息了。 ... 接下來我們換一個請求呢?是不是Cookie也會帶過去呢?接下來我們輸入路徑http://localhost:8005請求。我們可以看到Cookie欄位還是被帶過去了。 ... 那麼瀏覽器的Cookie是存放在哪呢?如果是使用的是Chrome瀏覽器的話,那麼可以按照下面步驟。 在計算機打開Chrome 在右上角,一次點擊更多圖標->設置 在底部,點擊高級 在隱私設置和安全性下方,點擊網站設置 依次點擊Cookie->查看所有Cookie和網站數據 然後可以根據域名進行搜索所管理的Cookie數據。所以是瀏覽器替你管理了Cookie的數據,如果此時你換成了Firefox等其他的瀏覽器,因為Cookie剛才是存儲在Chrome裡面的,所以伺服器又蒙圈了,不知道你是誰,就會給Firefox再次貼上小紙條。 ... Cookie中的參數設置 說到這裡,應該知道了Cookie就是伺服器委託瀏覽器存儲在客戶端里的一些數據,而這些數據通常都會記錄用戶的關鍵識別信息。所以Cookie需要用一些其他的手段用來保護,防止外泄或者竊取,這些手段就是Cookie的屬性。 參數名作用後端設置方法Max-Age設置cookie的過期時間,單位為秒cookie.setMaxAge(10)Domain指定了Cookie所屬的域名cookie.setDomain("")Path指定了Cookie所屬的路徑cookie.setPath("");HttpOnly告訴瀏覽器此Cookie只能靠瀏覽器Http協議傳輸,禁止其他方式訪問cookie.setHttpOnly(true)Secure告訴瀏覽器此Cookie只能在Https安全協議中傳輸,如果是Http則禁止傳輸cookie.setSecure(true) 下面我就簡單演示一下這幾個參數的用法及現象。 Path 設置為cookie.setPath("/testCookies"),接下來我們訪問http://localhost:8005/testCookies,我們可以看到在左邊和我們指定的路徑是一樣的,所以Cookie才在請求頭中出現,接下來我們訪問http://localhost:8005,我們發現沒有Cookie欄位了,這就是Path控制的路徑。 ... Domain 設置為cookie.setDomain("localhost"),接下來我們訪問http://localhost:8005/testCookies我們發現下圖中左邊的是有Cookie的欄位的,但是我們訪問http://172.16.42.81:8005/testCookies,看下圖的右邊可以看到沒有Cookie的欄位了。這就是Domain控制的域名發送Cookie。 ... 接下來的幾個參數就不一一演示了,相信到這裡大家應該對Cookie有一些了解了。 Session > Cookie是存儲在客戶端方,Session是存儲在服務端方,客戶端只存儲SessionId 在上面我們了解了什麼是Cookie,既然瀏覽器已經通過Cookie實現了有狀態這一需求,那麼為什麼又來了一個Session呢?這裡我們想像一下,如果將帳戶的一些信息都存入Cookie中的話,一旦信息被攔截,那麼我們所有的帳戶信息都會丟失掉。所以就出現了Session,在一次會話中將重要信息保存在Session中,瀏覽器只記錄SessionId一個SessionId對應一次會話請求。 ... @RequestMapping("/testSession") @ResponseBody public String testSession(HttpSession session){ session.setAttribute("testSession","this is my session"); return "testSession"; } @RequestMapping("/testGetSession") @ResponseBody public String testGetSession(HttpSession session){ Object testSession = session.getAttribute("testSession"); return String.valueOf(testSession); } 這裡我們寫一個新的方法來測試Session是如何產生的,我們在請求參數中加上HttpSession session,然後再瀏覽器中輸入http://localhost:8005/testSession進行訪問可以看到在伺服器的返回頭中在Cookie中生成了一個SessionId。然後瀏覽器記住此SessionId下次訪問時可以帶著此Id,然後就能根據此Id找到存儲在服務端的信息了。 ... 此時我們訪問路徑http://localhost:8005/testGetSession,發現得到了我們上面存儲在Session中的信息。那麼Session什麼時候過期呢? 客戶端:和Cookie過期一致,如果沒設置,默認是關了瀏覽器就沒了,即再打開瀏覽器的時候初次請求頭中是沒有SessionId了。 服務端:服務端的過期是真的過期,即伺服器端的Session存儲的數據結構多久不可用了,默認是30分鐘。 ... 既然我們知道了Session是在服務端進行管理的,那麼或許你們看到這有幾個疑問,Session是在在哪創建的?Session是存儲在什麼數據結構中?接下來帶領大家一起看一下Session是如何被管理的。 Session的管理是在容器中被管理的,什麼是容器呢?Tomcat、Jetty等都是容器。接下來我們拿最常用的Tomcat為例來看下Tomcat是如何管理Session的。在ManageBase的createSession是用來創建Session的。 @Override public Session createSession(String sessionId) { //首先判斷Session數量是不是到了最大值,最大Session數可以通過參數設置 if ((maxActiveSessions >= 0) && (getActiveSessions() >= maxActiveSessions)) { rejectedSessions++; throw new TooManyActiveSessionsException( sm.getString("managerBase.createSession.ise"), maxActiveSessions); } // 重用或者創建一個新的Session對象,請注意在Tomcat中就是StandardSession // 它是HttpSession的具體實現類,而HttpSession是Servlet規範中定義的接口 Session session = createEmptySession(); // 初始化新Session的值 session.setNew(true); session.setValid(true); session.setCreationTime(System.currentTimeMillis()); // 設置Session過期時間是30分鐘 session.setMaxInactiveInterval(getContext().getSessionTimeout() * 60); String id = sessionId; if (id == null) { id = generateSessionId(); } session.setId(id);// 這裡會將Session添加到ConcurrentHashMap中 sessionCounter++; //將創建時間添加到LinkedList中,並且把最先添加的時間移除 //主要還是方便清理過期Session SessionTiming timing = new SessionTiming(session.getCreationTime(), 0); synchronized (sessionCreationTiming) { sessionCreationTiming.add(timing); sessionCreationTiming.poll(); } return session } 到此我們明白了Session是如何創建出來的,創建出來後Session會被保存到一個ConcurrentHashMap中。可以看StandardSession類。 protected Map<string, session> sessions = new ConcurrentHashMap<>(); 到這裡大家應該對Session有簡單的了解了。 > Session是存儲在Tomcat的容器中,所以如果後端機器是多臺的話,因此多個機器間是無法共享Session的,此時可以使用Spring提供的分布式Session的解決方案,是將Session放在了Redis中。 Token Session是將要驗證的信息存儲在服務端,並以SessionId和數據進行對應,SessionId由客戶端存儲,在請求時將SessionId也帶過去,因此實現了狀態的對應。而Token是在服務端將用戶信息經過Base64Url編碼過後傳給在客戶端,每次用戶請求的時候都會帶上這一段信息,因此服務端拿到此信息進行解密後就知道此用戶是誰了,這個方法叫做JWT(Json Web Token)。 ... > Token相比較於Session的優點在於,當後端系統有多臺時,由於是客戶端訪問時直接帶著數據,因此無需做共享數據的操作。 Token的優點 簡潔:可以通過URL,POST參數或者是在HTTP頭參數發送,因為數據量小,傳輸速度也很快 自包含:由於串包含了用戶所需要的信息,避免了多次查詢資料庫 因為Token是以Json的形式保存在客戶端的,所以JWT是跨語言的 不需要在服務端保存會話信息,特別適用於分布式微服務 JWT的結構 實際的JWT大概長下面的這樣,它是一個很長的字符串,中間用.分割成三部分 ... JWT是有三部分組成的 Header 是一個Json對象,描述JWT的元數據,通常是下面這樣子的 { "alg": "HS256", "typ": "JWT" } 上面代碼中,alg屬性表示簽名的算法(algorithm),默認是 HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的類型(type),JWT 令牌統一寫為JWT。 最後,將上面的 JSON 對象使用 Base64URL 算法轉成字符串。 > JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/?token=xxx)。Base64 有三個字符+、/和=,在 URL 裡面有特殊含義,所以要被替換掉:=被省略、+替換成-,/替換成_ 。這就是 Base64URL 算法。 Payload Payload部分也是一個Json對象,用來存放實際需要傳輸的數據,JWT官方規定了下面幾個官方的欄位供選用。 iss (issuer):簽發人 exp (expiration time):過期時間 sub (subject):主題 aud (audience):受眾 nbf (Not Before):生效時間 iat (Issued At):簽發時間 jti (JWT ID):編號 當然除了官方提供的這幾個欄位我們也能夠自己定義私有欄位,下面就是一個例子 { "name": "xiaoMing", "age": 14 } 默認情況下JWT是不加密的,任何人只要在網上進行Base64解碼就可以讀到信息,所以一般不要將秘密信息放在這個部分。這個Json對象也要用Base64URL 算法轉成字符串 Signature Signature部分是對前面的兩部分的數據進行簽名,防止數據篡改。 首先需要定義一個秘鑰,這個秘鑰只有伺服器才知道,不能泄露給用戶,然後使用Header中指定的簽名算法(默認情況是HMAC SHA256),算出簽名以後將Header、Payload、Signature三部分拼成一個字符串,每個部分用.分割開來,就可以返給用戶了。 > HS256可以使用單個密鑰為給定的數據樣本創建簽名。當消息與簽名一起傳輸時,接收方可以使用相同的密鑰來驗證簽名是否與消息匹配。 ... Java中如何使用Token 上面我們介紹了關於JWT的一些概念,接下來如何使用呢?首先在項目中引入Jar包 compile('io.jsonwebtoken:jjwt:0.9.0') 然後編碼如下 // 簽名算法 ,將對token進行簽名 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; // 通過秘鑰簽名JWT byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("SECRET"); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); Map<string,object> claimsMap = new HashMap<>(); claimsMap.put("name","xiaoMing"); claimsMap.put("age",14); JwtBuilder builderWithSercet = Jwts.builder() .setSubject("subject") .setIssuer("issuer") .addClaims(claimsMap) .signWith(signatureAlgorithm, signingKey); System.out.printf(builderWithSercet.compact()); 發現輸出的Token如下 eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzdWJqZWN0IiwiaXNzIjoiaXNzdWVyIiwibmFtZSI6InhpYW9NaW5nIiwiYWdlIjoxNH0.3KOWQ-oYvBSzslW5vgB1D-JpCwS-HkWGyWdXCP5l3Ko 此時在網上隨便找個Base64解碼的網站就能將信息解碼出來 ... 總結 相信大家看到這應該對Cookie、Session、Token有一定的了解了,接下來再回顧一下重要的知識點 Cookie是存儲在客戶端的 Session是存儲在服務端的,可以理解為一個狀態列表。擁有一個唯一會話標識SessionId。可以根據SessionId在服務端查詢到存儲的信息。 Session會引發一個問題,即後端多臺機器時Session共享的問題,解決方案可以使用Spring提供的框架。 Token類似一個令牌,無狀態的,服務端所需的信息被Base64編碼後放到Token中,伺服器可以直接解碼出其中的數據。 ...
RF4545NNEEFE115R |
文章來源取自於:
每日頭條 https://kknews.cc/code/m98yqag.html
MOMO購物網 https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=6878800&memid=6000007380&cid=apuad&oid=1&osm=league
如有侵權,請來信告知,我們會立刻下架。
DMCA:dmca(at)kubonews.com
聯絡我們:contact(at)kubonews.com
【momo優惠現金禮】【momo優惠年終】【這一款Dcard上口碑評價推薦還不錯】【momo優惠百貨公司週年慶】
【momo tv折扣優惠開箱評價】 【Angel LaLa 天使娜拉】薑黃人蔘蜆B群緩釋加強錠(30錠盒x4盒)【momo電視購物電話折扣優惠開箱評價】 【樂活動】Light 輕量、功能型 輔助餐具(右彎湯匙)【momo親子折扣優惠開箱評價】 【林內】深罩式 自動清洗 電熱除油 排油煙機80cm RH-8033S(電熱除油雙效)【momo電視購物台折扣優惠開箱評價】 【耆妙屋】多功能洗澡便器椅
留言列表