解決cookie跨域訪問

一、前言

  隨著項目模塊越來越多,很多模塊現在都是獨立部署。模塊之間的交流有時可能會通過cookie來完成。比如說門戶和應用,分別部署在不同的機器或者web容器中,假如用戶登陸之后會在瀏覽器客戶端寫入cookie(記錄著用戶上下文信息),應用想要獲取門戶下的cookie,這就產生了cookie跨域的問題。  

二、介紹一下cookie

  cookie?路徑:

  cookie 一般都是由于用戶訪問頁面而被創建的,可是并不是只有在創建 cookie 的頁面才可以訪問這個cookie。在默認情況下,出于安全方面的考慮,只有與創建 cookie 的頁面處于同一個目錄或在創建cookie頁面的子目錄下的網頁才可以訪問。那么此時如果希望其父級或者整個網頁都能夠使用cookie,就需要進行路徑的設置。

  path表示cookie所在的目錄,asp.net默認為/,就是根目錄。在同一個服務器上有目錄如下:/test/,/test/cd/,/test/dd/,現設一個cookie1的path為/test/,cookie2的path為/test/cd/,那么test下的所有頁面都可以訪問到cookie1,而/test/和/test/dd/的子頁面不能訪問cookie2。這是因為cookie能讓其path路徑下的頁面訪問。

  讓這個設置的cookie 能被其他目錄或者父級的目錄訪問的方法:

 document.cookie = "name = value; path=/";

  cookie 域:

  domain表示的是cookie所在的域,默認為請求的地址,如網址為www.jb51.net/test/test.aspx,那么domain默認為www.jb51.net。而跨域訪問,如域A為t1.test.com,域B為t2.test.com,那么在域A生產一個令域A和域B都能訪問的cookie就要將該cookie的domain設置為.test.com;如果要在域A生產一個令域A不能訪問而域B能訪問的cookie就要將該cookie的domain設置為t2.test.com。

三、解決cookie跨域問題之nginx反向代理

  反向代理概念

  反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然后將請求轉發給內部網絡上的服務器;并將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。

  反向代理服務器對于客戶端而言它就像是原始服務器,并且客戶端不需要進行任何特別的設置。客戶端向反向代理 的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始服務器)轉交請求,并將獲得的內容返回給客戶端,就像這些內容 原本就是它自己的一樣。

?  場景模擬

兩個工程web1,?web2,?部署在同一臺機器上的不同tomcat上,請求web1工程的index.html,如下:
然后點擊鏈接請求web2工程的index.jsp,?內容如下:

?

  再看一下nginx的配置,如下:

worker_processes  2; 
events {worker_connections  65535;
}
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  0;keepalive_timeout  65;upstream web1{server  127.0.0.1:8089  max_fails=0 weight=1;}upstream web2 {server 127.0.0.1:8080    max_fails=0 weight=1;}server {listen       80;server_name  127.0.0.1;charset utf-8;index index.html;location /web/web1 {proxy_pass http://web1/web1;proxy_set_header Host  127.0.0.1;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 /web/web2 {proxy_pass http://web2/web2;proxy_set_header Host  127.0.0.1;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 /nginxstatus {
            stub_status on;access_log on;}error_page   500 502 503 504  /50x.html;location = /50x.html {
            root   html;}}
}
 
這樣就可以保證cookie在同一域下。web2工程中的index.jsp中的輸出內容如下:

  總結

利用nginx的方向代理來解決cookie跨域問題,其實是通過“欺騙”瀏覽器來實現的,通過nginx,我們可以將不同工程的cookie放到nginx域下,通過nginx反向代理就可以取到不同工程寫入的cookie。其實上述場景中?$.cookie("user", "hjzgg", {path: "/web"}); 中的path可以寫成 “/”, 這樣nginx的配置就更為簡單了,如下。
     location /web1 {proxy_pass http://web1;proxy_set_header Host  127.0.0.1;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 /web2 {proxy_pass http://web2;proxy_set_header Host  127.0.0.1;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;}

四、解決cookie跨域問題之jsonp方式請求

  jquery請求跨域:

JQuery對于Ajax的跨域請求有兩類解決方案,不過都是只支持get方式。分別是JQuery的?jquery.ajax?jsonp格式和jquery.getScript方式。

  jsonp格式:

如果獲取的數據文件存放在遠程服務器上(域名不同,也就是跨域獲取數據),則需要使用jsonp類型。使用這種類型的話,會創建一個查詢字符串參數 callback=? ,這個參數會加在請求的URL后面。服務器端應當在JSON數據前加上回調函數名,以便完成一個有效的JSONP請求。意思就是遠程服務端需要對返回的數據做下處理,根據客戶端提交的callback的參數,返回一個callback(json)的數據,而客戶端將會用script的方式處理返回數據,來對json數據做處理。JQuery.getJSON也同樣支持jsonp的數據方式調用。

  場景模擬:

  兩個工程web1,?web2,?部署在本地同一臺機器上的不同tomcat上,端口分別是8080和8089。

  web2/index.html內容如下:

  

? ?

 ? web2/cooke.jsp內容如下:

  

 

  web1/index.html內容如下:

  

  

  測試流程,首先通過谷歌瀏覽器訪問http://localhost:8089/web2/index.html,F12,Network視圖,查看內容如下:

  

  

  或者通過瀏覽器設置->顯示高級設置->隱私設置來查看寫入的cookie,過程如下。

  ?

    

  接著,打開另一個窗口,訪問http://localhost:8080/web1/index.html,這個頁面是請求web2工程寫入的cookie(注意,如果我們不是通過jsonp方式去訪問,那么瀏覽器就會出現 不允許跨域訪問 的提示)。同樣 F12, Network視圖,查看返回的數據如下。

?  

  

?

  

  

  至此,通過jsonp方式的請求完成cookie跨域攜帶,也就是web1工程成功拿到了web2工程目錄下的cookie。可以發現,jsonp會通過回調函數來處理服務器端返回的數據,因為返回的可以執行的js代碼(也就是重寫cookie的path和域),然后自動執行返回的js代碼,從而達到目的。

五、解決cookie跨域問題之nodejs superagent

  package.json中的模塊依賴:

  

  調用superagent api請求:

  

?六、同一域下,不同工程下的cookie攜帶問題

  cookie跨域訪問之后,可以成功的寫入本地域。本地的前端工程在請求后端工程時,有很多是ajax請求,ajax默認不支持攜帶cookie,所以現在有以下兩種方案:

(1). 使用jsonp格式發送
(2).?
ajax請求中加上字段?xhrFields:?{withCredentials:?true},這樣可以攜帶上cookie

      

      

  ?   ?這樣后臺配置就出現了限制,需要配置一個解決跨域訪問的過濾器,而且header字段Access-Control-Allow-Origin的值不能為"*", 必須是一個確定的域。

      

?

?七、參考資料

  HTTP訪問控制(CORS) 

? ? ?JavaScript跨域總結與解決辦法   

? ? ?window.name實現的跨域數據傳輸

? ? ? ? ??使用 window.name 解決跨域問題

?

轉載于:https://www.cnblogs.com/hujunzheng/p/5744755.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React使用antd Table生成層級多選組件

一、需求 用戶對不同的應用需要有不同的權限,用戶一般和角色關聯在一起,新建角色的時候會選擇該角色對應的應用,然后對應用分配權限。于是寫了一種實現的方式。首先應用是一個二級樹,一級表示的是應用分組,二級表示的是…

junit4進行單元測試

一、前言 提供服務的時候,為了保證服務的正確性,有時候需要編寫測試類驗證其正確性和可用性。以前的做法都是自己簡單寫一個控制層,然后在控制層里調用服務并測試,這樣做雖然能夠達到測試的目的,但是太不專業了。還是老…

快速搭建springmvc+spring data jpa工程

一、前言 這里簡單講述一下如何快速使用springmvc和spring data jpa搭建后臺開發工程,并提供了一個簡單的demo作為參考。 二、創建maven工程 http://www.cnblogs.com/hujunzheng/p/5450255.html 三、配置文件說明 1.application.properties jdbc.drivercom.mysql.jd…

dubbo服務提供與消費

一、前言 項目中用到了Dubbo,臨時抱大腿,學習了dubbo的簡單實用方法。現在就來總結一下dubbo如何提供服務,如何消費服務,并做了一個簡單的demo作為參考。 二、Dubbo是什么 Dubbo是一個分布式服務框架,致力于提供高性能…

git親測命令

一、Git新建本地分支與遠程分支關聯問題 git checkout -b branch_name origin/branch_name 或者 git branch --set-upstream branch_name origin/branch_name 或者 git branch branch_name git branch --set-upstream-toorigin/branch_name branch_name 二、查看本地分支所關…

mysql 7下載安裝及問題解決

mysql 7安裝及問題解決 一、mysql下載 下載地址:https://www.mysql.com/downloads/Community (GPL) DownloadsMySQL Community Server (GPL)Windows (x86, 64-bit), ZIP ArchiveNo thanks, just start my download.二、mysql安裝 解壓到指定目錄在mysql bin目錄下打…

RestTemplate發送請求并攜帶header信息

1、使用restTemplate的postForObject方法 注&#xff1a;目前沒有發現發送攜帶header信息的getForObject方法。 HttpHeaders headers new HttpHeaders(); Enumeration<String> headerNames request.getHeaderNames(); while (headerNames.hasMoreElements()) {String k…

工作中常用到的命令

linux zip 和 unzip http://blog.csdn.net/shenyunsese/article/details/17556089 linux 查看日志 http://blog.chinaunix.net/uid-15463753-id-2943532.html linux 刪除 http://www.jb51.net/LINUXjishu/179430.html linux查看末尾日志&#xff08;tail -f&#xff09; http:/…

tomcat開發遠程調試端口以及利用eclipse進行遠程調試

一、tomcat開發遠程調試端口 方法1 WIN系統 在catalina.bat里&#xff1a;   SET CATALINA_OPTS-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address8899   Linux系統 在catalina.sh里&#xff1a;   CATALINA_OPTS&q…

webpack+react+redux+es6開發模式

一、預備知識 node, npm, react, redux, es6, webpack 二、學習資源 ECMAScript 6入門 React和Redux的連接react-redux Redux 入門教程 redux middleware 詳解 Redux研究 React 入門實例教程 webpack學習demo NPM 使用介紹 三、工程搭建 之前有寫過 webpackreactes6開發模式…

fiddler發送post請求

1.指定為 post 請求&#xff0c;輸入 url Content-Type: application/x-www-form-urlencoded;charsetutf-8 request body中的參數格式&#xff1a;userNameadminicxp&userPassword123qwe!# 這種方式可以用 request.getParameter的方式來獲得。 2.指定為 post 請求&#xff…

基于spring注解AOP的異常處理

一、前言 項目剛剛開發的時候&#xff0c;并沒有做好充足的準備。開發到一定程度的時候才會想到還有一些問題沒有解決。就比如今天我要說的一個問題&#xff1a;異常的處理。寫程序的時候一般都會通過try...catch...finally對異常進行處理&#xff0c;但是我們真的能在寫程序的…

Kettle之數據抽取、轉換、裝載

Kettle 官網 ETL利器Kettle實戰應用解析系列 利用kettle組件導入excel文件到數據庫 kettle中實現動態SQL查詢 java中調用kettle轉換文件 kettle 7.x版本下載&#xff1a;https://pan.baidu.com/s/1nvnzzCH  密碼&#xff1a;6f5c mac 下運行spoon.sh,  windows下為spoon.bat…

webpack+react+redux+es6開發模式---續

一、前言 之前介紹了webpackreactreduxes6開發模式 &#xff0c;這個項目對于一個獨立的功能節點來說是沒有問題的。假如伴隨著源源不斷的需求&#xff0c;前段項目會涌現出更多的功能節點&#xff0c;需要獨立部署運行。為了更好地管理這些獨立的功能節點&#xff0c;我們需要…

JdbcTemplate使用小結

org.springframework.jdbc.core.JdbcTemplate.query(String sql, Object[] args, RowMapper<StaffUnionVO> rowMapper) throws DataAccessException 1.自定義rowMapper public class StaffUnionVO implements RowMapper<StaffUnionVO>, Serializable {private stat…

RabbitMQ安裝和使用(和Spring集成)

一、安裝Rabbit MQ   Rabbit MQ 是建立在強大的Erlang OTP平臺上&#xff0c;因此安裝Rabbit MQ的前提是安裝Erlang。通過下面兩個連接下載安裝3.2.3 版本&#xff1a; 下載并安裝 Eralng OTP For Windows (vR16B03)運行安裝 Rabbit MQ Server Windows Installer (v3.2.3)具體…

單點登錄實現(spring session+redis完成session共享)

一、前言 項目中用到的SSO&#xff0c;使用開源框架cas做的。簡單的了解了一下cas&#xff0c;并學習了一下 單點登錄的原理&#xff0c;有興趣的同學也可以學習一下&#xff0c;寫個demo玩一玩。 二、工程結構 我模擬了 sso的客戶端和sso的服務端&#xff0c; sso-core中主要是…

maven deploy上傳私服出錯

error 內容如下 Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5: deploy (default-deploy) on project XXX pom文件增加如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifa…

加密策略

一、前言 這兩天研究了一下項目中的密碼加密&#xff0c;可以說得上是學到了很多。下面來大致說一下。 二、常用加密 1.單向加密算法 單向加密算法主要用來驗證數據傳輸的過程中&#xff0c;是否被篡改過。 BASE64 嚴格地說&#xff0c;屬于編碼格式&#xff0c;而非加密算法 …

Spring Data JPA: 實現自定義Repository

一、前言 由于項目中的 實體&#xff08;entity&#xff09;默認都是繼承一個父類&#xff08;包含一些公共的屬性&#xff0c;比如創建時間&#xff0c;修改時間&#xff0c;是否刪除&#xff0c;主鍵id&#xff09;。為了實現邏輯刪除&#xff0c;一般會自己實現RepositoryFa…