(關於Cookie共享的兩種解決方案Domain屬性和Nginx)
阿新 • • 發佈:2018-12-19
1.設定Cookie的Domain
首先要了解Cookie作用域,這裡就用到了cookie的兩個屬性 domain,path
-
domain 這個屬性可以設定cookie的作用域,path可以設定cookie的作用路徑
-
當作用域相同和作用路徑相同的時候才可以事項cookie共享 那麼知道了domain和path的作用之後就開始解決問題把
-
現在有A,B兩個專案,我希望在a專案登入後在b也能保持登入狀態就需要把使用者資訊存入cookie,那這時候b就要獲取a的cookie,首先專案域分別是a.test.com和b.test.com沒有(域名是要給domain賦值用的)所以沒有域名的話去修改下host檔案把
//登入後把使用者資訊寫入cookie,我這裡是存進去一個token值這裡就當做token=user1
Cookie user_cookie = new Cookie("token","user1");
//設定cookie的domain這裡注意寫的是主域名
//(a.test.com,b.test.com的主域名就是.test.com)
//寫入這個引數之後所有主域名為.test.com的專案都可以呼叫這個cookie
user_cookie.setDomain(".test.com");
//設定cookie的path
//path這裡直接寫 / 表示所有路徑都可以訪問
user_cookie.setPath("/");
//然後返回cookie
response.addCookie(user_cookie);
這個時候去瀏覽器檢視你的cookie你會發現展示的domain和path都是你設定的了 就這樣就可以實現cookie共享了 這個方法簡單但是有一個弊端 就是你的專案必須是同一個主域名才可以,那麼當我們的域名不同的時候怎麼實現呢?就要看第二個解決方法Nginx反向代理(欺騙瀏覽器)
2. Nginx反向代理
其實原理都是一樣的,讓cookie的作用域和作用路徑相同就可以實現cookie共享 ,Nginx則是用反向代理來代理兩個專案伺服器,這時候瀏覽器就認為兩個伺服器 不說廢話直開始來源相同就可以實現cookie共享了,不說廢話開始
首先要去安裝一個Nginx安裝教程這裡就不發了網上一搜一大堆Windows,Linux應有盡有,另外我這裡部署專案用的是Tomcat8.5
下載後進入Nginx目錄如下 nginx-1.14.0 |— --conf |— --contrib |— --docs |— --html |— --temp |— --nginx.exe 進入conf目錄可以看到一個nginx.conf的檔案Nginx的配置就在這裡進行就好啦 nginx會預設給我們配置一些引數這裡不做詳細講解,只解決問題 開啟配置檔案 如果有興趣最好可以去好好看看 這裡只附上Http模組下內容
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_body_buffer_size 8m;
server_tokens off;
ignore_invalid_headers on;
recursive_error_pages on;
server_name_in_redirect off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#上面這些引數用Nginx預設的即可
#我們今天的重點配置在這裡
#upstream 這裡設定代理的物件 寫上我們的專案路徑域名,ip都可
# project1,project2是自己起的名字
upstream project1{
server 192.168.1.41:8080; #記得改成自己的ip和埠
}
upstream project2{
server 192.168.1.41:8081; #記得改成自己的ip和埠
}
#這裡配置我們的server
server {
listen 888;#監聽埠 就是你訪問Nginx的埠號自己定
#//給這個server起一個別名 http模組可有多個server 這個名字是唯一標識
server_name demo1;
#location /[這裡跟你的專案名] 就是你在Tomcat部署的專案路徑
location /project1 {
proxy_pass http://project1;#這裡對應上邊宣告的upstream 代表跳轉的目標專案
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
log_subrequest on;
}
#同上配置第二專案
location /project2 {
proxy_pass http://project2;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
log_subrequest on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}