最近在使用GeoServer調用Vector Tile服務時,經常會顯示不出來結果。打開瀏覽器調試台,發現報No 'Access-Control-Allow-Origin' header is present on the requested resource這個錯誤。主要原因是不能跨域訪問。例如服務器上有兩個服務A和B,A的端口是6000,B的端口是6001,則A不能直接調用B的端口。為了解決這個問題,通過上網查找資料,特別是Tomcat的官方文檔,最后總結出兩種解決方案。
方案一:安裝chrome插件
對於chrome瀏覽器,可以安裝"Allow-Control-Allow-Origin: *"這個插件(搜索Allow-Control-Allow-Origin即可)。安裝后,選擇Enable cross-origin resource sharing即可。刷新后即可正常訪問。
方案二:修改Tomcat配置文件,添加Filter
這是根據官方文檔進行的修改:官方文檔添加Filter
添加CORS Filter,其方法是修改tomcat文件夾下/conf/web.xml文件,或對於特殊的web應用,修改其對應的/WEB-INF/web.xml文件。添加如下代碼:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
之后重啟服務。一段時間后即可正常訪問。