寫在前面:只使用token並不能起到安全驗證的作用,ArcGIS Server文件夾的權限是開放的,我們不需要登錄Server平臺即可訪問服務,所以我們應該將Token驗證和文件夾的安全性結合起來使用,將文件夾的權限設爲私有,這樣必須先要登錄才能訪問服務。
當我們的服務發佈到外網,但是我們又不希望其他人員訪問我們的服務。這時我們就需要對服務的請求進行驗證,類似於使用用戶名和密碼進行登錄。相當於先用進行驗證,驗證成功再響應服務請求。實質上我們在請求服務的過程就進行了兩步操作。在ArcGIS API for JavaScript中如何實現這兩步操作?我們可以使用代理的方式,即在客戶端和GIS服務器之間再添加一個服務,這個服務首先接收我們客戶端的請求,然後根據配置文件裏面的用戶名和密碼第一個和GIS服務器握手,並獲取token,將獲取到的token返回到代理服務,代理服務再將我們客戶端請求的url和token進行合併,向GIS服務器請求服務,GIS服務器解析token,並相應請求給代理服務,代理服務返回結果給客戶端:
在Web系統中使用Token驗證(.NET版本):
2.爲服務所在文件夾設置權限,進入到服務--》管理服務--》選中站點--》鼠標放在菜單--》編輯文件夾安全性--》私有--》賦角色:
3.在https://github.com/Esri/resource-proxy/releases 下載代理頁面,我們只需要proxy.ashx和proxy.config文件,也可選擇本文末尾作者提供的實例(建議使用);
4.進入Web工程,將proxy.ashx和proxy.config添加到項目目錄,最好和JS文件在同一目錄;
5.修改proxy.config:
<serverUrl url ="http://192.168.1.6:6080/arcgis/rest/services" matchAll="true" dynamicToken="true" host="192.168.1.6:6080" userName="yangtao" password="262728"></serverUrl>
修改url中ip爲GIS服務器ip;host也爲GIS服務器ip;userName爲在Server裏面添加的用戶;password爲用戶密碼。
6.在require中設置代理:
esriConfig.defaults.io.proxyUrl = "proxy.ashx"; esriConfig.defaults.io.alwaysUseProxy = true;
alwaysUseProxy爲true表示始終使用代理,在測試過程,若底圖使用ersi地圖,出現錯誤,用天地圖則跳過代理,實現只是對服務使用代理。
目錄結構:
index.html、proxy.confog和proxy.ashx統計目錄,也可以不同級。
proxy.config配置實例:
<serverUrl url ="http://192.168.1.6:6080/arcgis/rest/services" matchAll="true" dynamicToken="true" host="192.168.1.6:6080" userName="yangtao" password="262728" ></serverUrl>
客戶端調用實例:
require(["esri/map", "esri/config", "esri/layers/ArcGISDynamicMapServiceLayer", "extras/TDTRoadLayer", "dojo/domReady!"], function (Map, esriConfig, ArcGISDynamicMapServiceLayer, TDTRoadLayer) { esriConfig.defaults.io.proxyUrl = "proxy.ashx"; esriConfig.defaults.io.alwaysUseProxy = true; var map = new Map("map", { center: [104, 30], zoom: 8 }); var layer = new TDTRoadLayer(); map.addLayer(layer); var dynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer("http://192.168.1.6:6080/arcgis/rest/services//test/china/MapServer"); map.addLayer(dynamicMapServiceLayer); });
注:
1.對於下載的附件,需要修改proxy,config裏面的參數(url、host、userName、password四個參數);
2.修改index.html中ArcGISDynamicMapServiceLayer服務地址爲正確的可訪問服務地址。
<script> var map; require(["esri/map", "src/TDMapLayer", "src/TDMapAnnoLayer", "src/TDMapImageLayer", "esri/layers/FeatureLayer", "esri/geometry/Point", "esri/layers/ArcGISDynamicMapServiceLayer", "dojo/domReady!"], function (Map, TDTLayer, TDTAnnoLayer, TDMapImageLayer, FeatureLayer, Point,ArcGISDynamicMapServiceLayer ){ map = new Map("map", { logo: false }); var basemap = new TDTLayer(); //var basemap = new TDMapImageLayer(); map.addLayer(basemap); var annolayer = new TDTAnnoLayer(); map.addLayer(annolayer); //var test = new ArcGISDynamicMapServiceLayer("http://192.168.4.239:6080/arcgis/rest/services/other/test_tianditu/MapServer"); var test = new ArcGISDynamicMapServiceLayer("http://61.50.105.254:6083/arcgis/rest/services/tianjin/WWZ_JZsytle/MapServer?token=VSYowJLPU9Mjm9a-ZIrowjQzt8zVPTCJAYZX-m2XLFdzPMYmJbDF4WPiRtpQEmQK"); map.addLayer(test); //var pt = new Point(112.206,32.13); var pt = new Point(117.262,38.895); map.centerAndZoom(pt, 12); }); </script>
var token = VSYowJLPU9Mjm9a-ZIrowjQzt8zVPTCJAYZX-m2XLFdzPMYmJbDF4WPiRtpQEmQK; //王穩莊道路地圖 function layer2() { //Map.setCenter([117.20254822800007,38.84896601300005], 15); Map.createTitleLayer('image',{ create: true, layerType: 'Tile', addLayer: true, //layerUrl: 'http://61.50.105.254:6083/arcgis/rest/services/tianjin/wangwenzhuagn_dynamic/MapServer' layerUrl: 'http://61.50.105.254:6083/arcgis/rest/services/tianjin/WWZ_JZsytle/MapServer', params :{ token:token } }); Map.zoomToExtent([117.20254822800007,38.84896601300005,117.31731513400007,38.930471141000055]) }