代理作為 HTTP 客戶端和網(wǎng)絡(luò)服務(wù)器之間的中間連接點,可提高互聯(lián)網(wǎng)連接的安全性和隱私性。要支持在防火墻后面運行 Android Studio,就要為 Android Studio IDE 設(shè)置代理設(shè)置。使用 Android Studio IDE HTTP 代理設(shè)置頁面可為 Android Studio 設(shè)置 HTTP 代理設(shè)置;若從命令行或在未安裝 Android Studio 的計算機上運行 Android Plugin for Gradle,就要在 Gradle 編譯文件中設(shè)置代理設(shè)置。
insert(index, item) 方法用于將元素 item 插入列表的指定位置,示例如下:>>> x = ['www', 'com']>>> x.insert(1, 'imooc')>>> x['www', 'imooc', 'com']>>> x.insert(0, 'http')>>> x['http', 'www', 'imooc', 'com']>>> x.insert(4, 'end')>>> x['http', 'www', 'imooc', 'com', 'end']在第 2 行,將元素 ‘imooc’ 插入到列表的位置為 1 的地方在第 5 行,將元素 ‘http’ 插入到列表的位置為 0 的地方,即插入到隊列的首部在第 8 行,將元素 ‘end’ 插入到列表的位置為 4 的地方,即插入到隊列的尾部
Android Studio 支持 HTTP 代理設(shè)置,因此我們可以在防火墻后面或使用安全網(wǎng)絡(luò)運行 Android Studio。要在 Android Studio 中設(shè)置 HTTP 代理設(shè)置,請執(zhí)行以下操作:在菜單欄中,依次點擊 File > Settings(在 macOS 上,依次點擊 Android Studio > Preferences)。在左側(cè)窗格中,依次點擊 Appearance & Behavior > System Settings > HTTP Proxy。此時將顯示 HTTP Proxy 頁面。選擇 Auto-detect proxy settings 以使用自動代理配置網(wǎng)址來配置代理設(shè)置,或選擇 Manual proxy configuration 以自行輸入每一項設(shè)置。有關(guān)這些設(shè)置的詳細說明,請參閱 HTTP 代理。點擊 OK 以保存所做的更改。
在上面配置文件的基礎(chǔ)上,我們增加一個 server 指令塊,監(jiān)聽 9000 端口,匹配 url 請求,轉(zhuǎn)發(fā)到 web1.html 和 web2.html 頁面,具體配置如下: ... server { listen 9000; location /web1 { proxy_pass http://localhost:8081/web/web1.html; } location /web2 { proxy_pass http://localhost:8081/web/web2.html; } } ...這樣,當(dāng)我們訪問 url 地址 http://服務(wù)器ip:9000/web1 時,會將請求轉(zhuǎn)發(fā)到 http://localhost:8081/web/web1.html ,而這個如果是在服務(wù)器上執(zhí)行會根據(jù)前面的配置訪問靜態(tài)資源web1.html。 同樣,對于訪問 web2.html 頁面,我們只需要請求 http://服務(wù)器ip:9000/web2 即可。測試結(jié)果通過方向代理訪問 web1.html通過方向代理訪問 web2.html
例如給出如下 nginx 的訪問日志,需要對其進行分析并且輸出不同的狀態(tài)碼,利用顏色不同進行區(qū)分不同的狀態(tài)碼。112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1" 200 5276 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1" 200 12674 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:54 +0800] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1" 404 260490 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) Apessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:54 +0800] "GET /js/app.ec4e6290.js HTTP/1.1" 200 11149 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-vendors.3a6c246c.js HTTP/1.1" 200 260482 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /api/2 HTTP/1.1" 500 502 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-2eca3a5a.2f1d5ea3.js HTTP/1.1" 200 5276 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /css/chunk-91d36e6e.a5cb4df4.css HTTP/1.1" 200 1133 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-03341f87.78501520.js HTTP/1.1" 200 1059 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:55 +0800] "GET /js/chunk-91d36e6e.a1444c20.js HTTP/1.1" 200 12674 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:56 +0800] "GET /api/1 HTTP/1.1" 500 39193 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:56 +0800] "GET /img/download.f4b65200.png HTTP/1.1" 200 7737 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /img/background.fc2d80f1.png HTTP/1.1" 200 57711 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /img/peitu.a89ef99f.svg HTTP/1.1" 301 106569 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"223.104.189.205 - - [05/Nov/2019:17:10:57 +0800] "GET /fonts/element-icons.535877f5.woff HTTP/1.1" 200 28200 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.5(0x17000523) NetType/4G Language/zh_CN" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/download.f4b65200.png HTTP/1.1" 200 7737 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/scan.d3d981fc.png HTTP/1.1" 404 39193 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:10:59 +0800] "GET /img/background.fc2d80f1.png HTTP/1.1" 200 57711 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"112.65.61.117 - - [05/Nov/2019:17:11:00 +0800] "GET /img/peitu.a89ef99f.svg HTTP/1.1" 200 106569 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1278.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /index HTTP/1.1" 200 535 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /css/app.7d918353.css HTTP/1.1" 200 1290 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"14.106.162.188 - - [05/Nov/2019:17:14:40 +0800] "GET /js/app.ec4e6290.js HTTP/1.1" 404 11149 "https://smartsds.tools.anchnet.com/index" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/4G Language/zh_CN" "-"
這邊的代碼雖然很簡單,但是最核心的 Http 服務(wù)雛形已經(jīng)展示出來了,成熟的 Http 服務(wù)可以在這基礎(chǔ)上對以下模塊進行優(yōu)化:針對請求事件的 線程 / IO 優(yōu)化;Servlet 協(xié)議支持;配置獨立管理;Http協(xié)議內(nèi)容完善(比如緩存機制);支持虛擬主機配置;支持代理;rewrite 機制;安全認證。
官方定義:Requests is the only Non-GMO HTTP library for Python, safe for human consumption.簡單翻譯一下就是:Requests 是唯一適用于 Python 的 Non-GMO HTTP 庫,可供開發(fā)人員安全使用。上面是 requests 庫的官方定義。簡單來說 requests 庫是 Python 的第三方 HTTP 庫,以 urllib 為基礎(chǔ)。因為使用簡單,人性化,安全的特性,被廣泛的用來爬蟲的請求發(fā)送。
本文來學(xué)習(xí)一下如何進行 Go 語言的性能測試。這里需要學(xué)習(xí)一個 Go 語言官方提供的工具 pprof:runtime/pprof:采集程序(非 Server)的運行數(shù)據(jù)進行分析;net/http/pprof:采集 HTTP Server 的運行時數(shù)據(jù)進行分析。上述兩個包的底層實現(xiàn)是一樣的,一般建議直接在主函數(shù)上加上 http 服務(wù)而使用第二個包,畢竟可視化顯示易于觀察和操作。故本文僅介紹 net/http/pprof 的用法。
在瀏覽器中訪問 http://localhost:5000/user,顯示如下:
要求進行代理身份驗證,類似于401,表示客戶必須先經(jīng)過代理服務(wù)器的授權(quán)。代理服務(wù)器返回需要認證的狀態(tài)HTTP/1.1 407 Proxy Authentication RequiredProxy-Authenticate: Basic; realm="Secured area"客戶端發(fā)起代理認證GET / HTTP/1.1Proxy-Authorization: Basic d2VsbCBkb25lOllvdSBmb3VuZCB0aGUgc2Vjb25kIGVhc3RlciBlZ2cK原站需要認證,代理服務(wù)器也需要認證的情況GET / HTTP/1.1Proxy-Authorization: Basic ZWFzdGVyIGVnZzpudW1iZXIgdGhyZWUKAuthorization: Bearer c2VuZCBtZSBhIHR3ZWV0IG9yIHNvbWV0aGluZwo
在瀏覽器中,訪問 http://localhost:5000/news/society/, 顯示如下:
requests 是一個的簡單易用的 http 庫,發(fā)出 http 請求并獲取響應(yīng),可以用于抓取網(wǎng)站的頁面。使用 requests.get(url) 方法抓取 baidu 的首頁,示例如下:>>> import requests>>> response = requests.get('https://www.baidu.com')>>> response.text'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>...在第 2 行,使用 requests.get(‘https://www.baidu.com’) 獲取 baidu 首頁在第 3 行,response.text 是 baidu 首頁 html 文件的內(nèi)容
首先在 application.properties 中指定配置文件的位置。實例:spring.cache.jcache.config=classpath:ehcache.xmlspring.cache.type=jcache然后在 resource 文件夾中添加 ehcache.xml 配置文件,內(nèi)容如下:實例:<?xml version="1.0" encoding="UTF-8"?><config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.ehcache.org/v3' xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"> <!-- 持久化路徑 --> <persistence directory="C://ehcache" /> <!--緩存模板 --> <cache-template name="CacheTemplate"> <expiry> <!--存活時間 --> <tti>60</tti> </expiry> <resources> <!--堆空間 --> <heap unit="entries">2000</heap> <!-- 堆外空間 --> <offheap unit="MB">500</offheap> </resources> </cache-template> <!--緩存對象 --> <cache alias="GoodsCache" uses-template="CacheTemplate"> </cache></config>Tips:Ehcache 的配置比較復(fù)雜,此處只是給出簡單的示例,感興趣的同學(xué)可以查閱更多資料。
Websocket 是一種升級版的 Http 服務(wù),傳統(tǒng)的 Http 服務(wù)都是客戶端發(fā)起,服務(wù)端響應(yīng),而 Websocket 支持服務(wù)端向客戶端主動推送消息,增強了瀏覽器的交互場景。Websocket 也是應(yīng)用層協(xié)議,跟 Http 一樣具體的實現(xiàn)都要基于 Socket,除此之外并沒有什么特殊。
例如前面的默認 Nginx.conf 示例中,下面一行就是一個指令:worker_processes 1;而使用花括號包圍起來的就是一個指令塊,比如 http 指令塊:http { # 繼續(xù)指令或者指令塊,如http指令塊可以包括server指令塊 ...}對于具體指令的參數(shù)、含義以及指令可以放入的指令塊等信息都可以在官方查到;
server { server_name location.test.com; listen 8010; location = / { return 200 "精確匹配/"; } location ~* /ma.*ch { return 200 "正則匹配/ma.*ch"; } location ~ /mat.*ch { return 200 "正則匹配/match.*"; } location = /test { return 200 "精確匹配/test"; } location ^~ /test/ { return 200 "前綴匹配/test"; } location ~ /test/he*o { return 200 "正則匹配/test/he*o"; } location / { return 200 "通配/"; }}我們按照這樣的 location 規(guī)則,進行匹配實驗,結(jié)果如下:# 精確匹配優(yōu)先級最高$ curl http://localhost:8010/精確匹配/$ curl http://localhost:8010/test 精確匹配/test# 前綴匹配優(yōu)先級高于正則匹配$ curl http://180.76.152.113:8010/test/heeo 前綴匹配/test# 正則匹配,按照順序依次匹配,如果同時匹配兩個正則,則前面的優(yōu)先匹配$ curl http://180.76.152.113:8010/matxxch 正則匹配/ma.*ch# 什么都匹配不到時,最后匹配通配/$ curl http://180.76.152.113:8010/xxxxx 通配/
在 Go 語言中想要搭建一個 http 服務(wù)是非常容易的一件事情,一行代碼就可以了。代碼示例:package mainimport ( "net/http")func main() { http.ListenAndServe("127.0.0.1:9300", nil) //設(shè)置監(jiān)聽的端口}運行以上代碼可以得到一個服務(wù),在瀏覽器上輸入http://127.0.0.1:9300/,由于沒有編寫任何路由,所以只會出現(xiàn) 404 的提示:
接下來,注釋 ip_hash 指令,我們打開 hash user_$arg_username 這行配置的注釋, hash 指令可以讓我們根據(jù)我們設(shè)置的 key 進行 hash,然后根據(jù) hash 值選擇上游的服務(wù)器。具體測試參看下面的 Linux 命令:[shen@shen ~]$ curl http://180.76.152.113?username=shen8001, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server[shen@shen ~]$ curl http://180.76.152.113?username=test8000, server這里我們可以看到,在請求中帶上 username 參數(shù),Nginx 中配置的 hash 算法會根據(jù)請求中帶的 username 參數(shù)作為 key 去進行 hash,然后在根據(jù) hash 結(jié)果映射上游服務(wù)器。username 相同時,選擇的上游服務(wù)器肯定是一樣的,只有在 username 的值發(fā)生變化時,返回的響應(yīng)才可能有變化。
通過設(shè)置 HTTP 的 Set-Cookie 消息頭,Web 服務(wù)器將 Cookie 發(fā)送給瀏覽器。Set-Cookie 消息的格式如下面所示,括號中的部分都是可選的:Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]消息頭的第一部分,value 部分,通常是一個 name=value 格式的字符串。服務(wù)端向客戶端發(fā)送的 HTTP 響應(yīng)中設(shè)置 HTTP 的 Set-Cookie 消息頭,一個具體的例子如下:Connection:keep-aliveContent-Type:text/plainDate:Fri, 14 Jul 2017 10:49:23 GMTSet-Cookie:user=ZhangSanTransfer-Encoding:chunked在這個例子中,服務(wù)端向客戶端發(fā)送的 HTTP 消息頭中,設(shè)置了 ‘Set-Cookie:user=ZhangSan’,客戶端瀏覽器將接受到字符串 ‘user=ZhangSan’ 作為 Cookie,下次訪問網(wǎng)站時,瀏覽器會將該 Cookie 發(fā)送給服務(wù)端。
客戶端收到服務(wù)端的 Cookie 后,該 Cookie 會在接下來的每個請求中被發(fā)送至服務(wù)器。Cookie 的值被存儲在名為 Cookie 的 HTTP 消息頭中,并且只包含了 Cookie 的值,其它的選項全部被去除??蛻舳讼蚍?wù)端發(fā)送的 HTTP 請求中設(shè)置 Cookie 消息頭,一個具體的例子如下:Connection:keep-aliveCookie:user=ZhangSanHost:localhost:8080User-Agent:Mozilla/5.0 AppleWebKit/537.36 Chrome Safari在這個例子中,客戶端向服務(wù)端發(fā)送的 HTTP 消息頭中,設(shè)置了 ‘Cookie:user=ZhangSan’,服務(wù)端接受到字符串 ‘user=ZhangSan’ 作為 Cookie,從而確認此次請求對應(yīng)的用戶。
本節(jié)討論了如何利用 HTTP 請求頭提升 Spring Security Web 項目的安全性,主要內(nèi)容有:Http 安全響應(yīng)頭是提升 B/S 應(yīng)用安全性的有效手段;Spring Security 默認實現(xiàn)了常用的安全響應(yīng)頭;Spring Security 可以通過配置類,直接開啟、關(guān)閉或調(diào)整各個內(nèi)置請求頭的狀態(tài)及參數(shù);Spring Security 提供了靜態(tài)設(shè)置響應(yīng)頭的方法;Spring Security 支持動態(tài)添加響應(yīng)頭;Spring Security 支持針對某個特殊請求動態(tài)設(shè)置響應(yīng)頭。下節(jié)我們討論針對 HTTP 協(xié)議,我們還能有哪些安全性提升策略。
啟動項目,訪問 http://127.0.0.1:8080/goods 返回數(shù)據(jù)如下:實例:{"code":0,"msg":"操作成功","data":[]}然后訪問 http://127.0.0.1:8080/test ,返回數(shù)據(jù)如下:實例:{"code":99999,"msg":"/ by zero","data":null}這樣,前端可以根據(jù)返回值的 code, 來判斷后端是否正常響應(yīng)。如果 code 為 0 ,則進行正常業(yè)務(wù)邏輯操作;如果 code 非 0 ,則可以彈窗顯示 msg 提示信息。
由于每個頁面都在 ViewPager 中,所以整體的布局非常簡單,我們只需要放置一個 ViewPager 以及一個 TextView 用來顯示當(dāng)前 Page 的標題即可。<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:showIn="@layout/activity_main"> <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> <TextView android:text="Num" android:textSize="100sp" android:id="@+id/text" android:layout_marginTop="50dp" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>
優(yōu)化搜索引擎定義頁面使用語言控制頁面緩存網(wǎng)頁定義評價控制頁面顯示窗口……例如<meta name="keywords" content="HTML,PHP,SQL"> <!-- 定義文檔關(guān)鍵詞,用于爬蟲搜索引擎 --><meta http-equiv="charset" content="iso-8859-1"> <!-- 定義文檔的字符集 --><meta http-equiv="expires" content="31 Dec 2020"> <!-- 定義文檔的緩存過期時間 -->
Http 并不單單應(yīng)用在 Web 網(wǎng)站中,桌面軟件/移動應(yīng)用這些客戶端要想與服務(wù)器交互數(shù)據(jù),也同樣可以借助 Http 協(xié)議。它是一種輕量級,跨語言,使用范圍很廣的傳輸協(xié)議。
啟動項目,打開瀏覽器訪問 http://127.0.0.1:8080/goods ,即可查看輸出結(jié)果。
先來看一個我們經(jīng)常見到的 URL 形式:http://idcbgp.cn/wiki/html5上面這個 URL 由以下幾部分組成:scheme://host:port/path?key=valuescheme:代表的是訪問的協(xié)議,一般為 http 或者 https。例如,https://www.baidu.com 的協(xié)議是 https;host:主機名、域名,例如,https://www.baidu.com 的 host 為 www.baidu.com;port:端口號,http 協(xié)議默認使用 80 端口,https 協(xié)議默認使用 443 端口。通常情況下,使用默認值,不需要顯式的寫明端口號,例如,https://www.baidu.com 的端口是 443。某些情況下,可以顯式的寫明端口號,例如,http://localhost:5000 的端口號是 5000;path:頁面路徑,例如:http://idcbgp.cn/wiki/html5 的 path 是 wiki/html5;key=value:查詢字符串,例如:https://www.baidu.com/s?wd=python,查詢字符串是 wd=python,查詢字符串包括兩部分:參數(shù)名和參數(shù)值,這個例子中,參數(shù)名是 wd,參數(shù)值是 python。
最重要的 CONTENT 是處理 Http 請求內(nèi)容的階段,大部分 HTTP 模塊介入這個階段,比如 index、autoindex、concat 以及反向代理的模塊都是在這里生效的。
content 階段中最主要的 static 模塊,該模塊提供了root 和 alias 這兩個常用的指令。二者的用法如下:Syntax: alias pathDefault: —Context: locationSyntax: root pathDefault: root htmlContext: http, server, location, if in location可以看到,單從指令用法上就可以看到不少區(qū)別,首先是 alias 指令沒有默認值,而且該指令只能在 location 中使用。而 root 可以存在與 http、server、location 等多個指令塊中,還可以出現(xiàn)在 if 指令中。另外,最最主要的不同是兩個指令會以不同的方式將請求映射到服務(wù)器文件上。root 指令會用[root 路徑 + location 路徑]的規(guī)則映射靜態(tài)資源請求,而 alias 會使用 alias 的路徑替換 location 路徑。此外 alias 后面必須要用“/”結(jié)束,否則會找不到文件的,而 root 則可有可無。來看下面一個例子:location ^~ /test { root /root/html/;}location ^~ /test2/ { alias /root/html/;}對于 http 請求: http://ip:端口/test/web1.html訪問的是主機 上全路徑為 /root/html/test/web1.html的靜態(tài)資源;而請求http://ip:端口/test2/web1.html 訪問的是全路徑為/root/html/web1.html的靜態(tài)資源,/test2/已經(jīng)被替換掉了。在 static 模塊中,還提供了 3 個變量供我們使用,分別是:request_filename: 訪問靜態(tài)資源的完整路徑document_root: 訪問靜態(tài)資源文件所在目錄realpath_root: 如果 document_root 是軟鏈接,則改變量會將其替換成真正的地址同樣是上面的例子,稍做改動: location /web { default_type text/html; alias /root/test/web; return 200 '$request_filename:$document_root:$realpath_root\n'; }訪問 http://ip:端口//web/web1.html, 返回的結(jié)果為:/root/test/web/web1.html:/root/test/web:/root/test/web在 content 階段,在 static 模塊之前,還會執(zhí)行的模塊有 index 和 autoindex模塊。index 模塊提供了 index 指令,用于指定/訪問時返回 index 文件內(nèi)容。autoindex 模塊會根據(jù)配置決定是否以列表的形式展示目錄下的內(nèi)容,這個功能在后續(xù)實戰(zhàn)中搭建內(nèi)部 pip 源中會用到。Syntax: index file ...;Default: index index.html;Context: http, server, location# 示例,訪問 uri=/ 時,返回靜態(tài)資源 index.html 文件中的內(nèi)容location / { index index.html;}# 是否開啟目錄顯示,默認Nginx是不會顯示目錄下的所有文件Syntax: autoindex on | off;Default: autoindex off;Context: http, server, location# 顯示出文件的實際大小Syntax: autoindex_exact_size on | off;Default: autoindex_exact_size on;Context: http, server, location# 顯示格式,默認是html形式顯示Syntax: autoindex_format html | xml | json | jsonp;Default: autoindex_format html;Context: http, server, location# 顯示時間,設(shè)置為on后,按照服務(wù)器的時鐘為準Syntax: autoindex_localtime on | off;Default: autoindex_localtime off;Context: http, server, location
客戶端已經(jīng)是在代理模式,服務(wù)端可能出于安全因素,提示客戶端需要切換一個新的代理。306 在新的規(guī)范中已經(jīng)不在使用,該編碼保留。HTTP/1.1 306 Switch ProxySet-Proxy: SET; proxyURI="https://proxy.imooc.com:8080/" scope="http://", seconds=100