跨域說通俗點就是在A網中使用ajax去擷取B網站的特定內容,這個就是跨域。跨域有兩種形式,一種是同一ip不同連接埠的跨域,一種是不同ip的跨域。
現在說說項目中用到的解決跨域檔案上傳的方法,中間遇到的各種坑就不說了;該上傳方法適用上述兩種情形。
注意該架構用的是nginx作為web伺服器。
前端html<form id="fp" action="" method="post" enctype="multipart/form-data"> <table > <tr> <td width="100" align="left"><input type="file" name="file" id="file" /></td> <td width="100" align="left"><input id="sub" style="background-color:#669900;" onclick="ajaxUp()" type="button" name="submit" value="上傳" /> </tr> </table> </form>
//ajaxfunction ajaxUp(){var formElement = document.forms.namedItem("fp"); var xhr = new XMLHttpRequest(); xhr.open("POST", upHttp, true); xhr.send(new FormData(formElement)); xhr.onload = function(e){var messg = eval('(' + this.response + ')');cookies(messg.id);location.reload();}}
nginx配置#user www www;worker_processes 1; #啟動進程,通常設定成和cpu的數量相等worker_rlimit_nofile 204800;events { use epoll; #epoll是多工IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上核心,可以大大提高nginx的效能 worker_connections 100; #單個後台worker process進程的最大並發連結數}http { access_log /opt/v0.1/wordFreServer/ngx_openresty/logs/access_appname.log combined; error_log /opt/v0.1/wordFreServer/ngx_openresty/logs/error_appname.log crit; include mime.types; #設定mime類型,類型由mime.type檔案定義 default_type application/octet-stream; #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出檔案,對於普通應用, #必須設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為 off,以平衡磁碟與網路I/O處理速度,降低系統的uptime. sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; #連線逾時時間 client_header_buffer_size 2k; #設定請求緩衝 lua_shared_dict config 1m; #init_by_lua_file 'server/init.lua'; server{ listen 8000; server_name localhost; location ~* /(\w+)/static/ { root /opt/v0.1/wordFreServer/ngx_openresty/web2py/applications/; } location / { uwsgi_pass 127.0.0.1:9001; include uwsgi_params; } } server { listen 7777;#偵聽連接埠 server_name localhost;lua_code_cache on;#上線後請設定為onclient_max_body_size 512m;location /favicon.ico { log_not_found off; access_log off; }location /wordFreq/upFile {if ($request_method = 'POST'){add_header 'Access-Control-Allow-Origin' '*';#set $debug "on"; content_by_lua_file server/upFile.lua; }}location /wordFreq/act {add_header 'Access-Control-Allow-Origin' '*'; set $debug "on"; content_by_lua_file server/act.lua; }location /test { default_type text/html; content_by_lua 'ngx.say("hello world")';}location ~* ^(.+\.txt)$ { add_header 'Access-Control-Allow-Origin' '*';root /opt/v0.1/wordFreServer/result; access_log off; expires 30d; add_header Content-Disposition "attachment; filename=$1";} }
在服務端的為某個請求服務添加 add_header 'Access-Control-Allow-Origin' '*'; 就能實現跨越,並且能夠獲得response,也不會出現警告資訊。