집 >데이터 베이스 >MySQL 튜토리얼 >找到的OpenLayers跨域访问WFS服务出现No 'Access
在eclipse中部署了一个使用OpenLayers的Java web项目CrossDomainTest,容器为Tomcat 7.0.56.(http://localhost:8080/CrossDomainTest/index.html) 利用Geoserver 2.5.2使用内置容器jetty 6.18发布WFS服务.(http://localhost:8888/geoserver/wfs). 从localh
在eclipse中部署了一个使用OpenLayers的Java web项目CrossDomainTest,容器为Tomcat 7.0.56.(http://localhost:8080/CrossDomainTest/index.html)
利用Geoserver 2.5.2使用内置容器jetty 6.18发布WFS服务.(http://localhost:8888/geoserver/wfs).
从localhost:8080访问localhost:8888的WFS无法得到预期效果,通过chrome浏览器开发者工具发现错误:No 'Access-Control-Allow-Origin' header is present on the requested resource. 查阅发现是所谓的Javascript安全性导致的“跨域问题”,找了很多的解决方法,比如设置cgi代理,CORS(跨域资源共享)等我都尝试了但不知为何没有成功,限于时间关系没有仔细追究,最后找到[Geoserver-users] CORS for jetty 6.1.8 (Geoserver 2.x), solved这篇文章,按其设置解决了问题:
<span>解决方案步骤为:</span>
<span>1.从这里下载ZIP文件,解压后放到</span><span><geoserver>\webapps\geoserver\WEB-INF\classes文件夹中。</geoserver></span>
<span>2.向</span><span><geoserver>\webapps\geoserver\WEB-INF\文件夹中的web.xml文件中增加如下配置文件允许所有域的跨域资源共享</geoserver></span><pre class="brush:php;toolbar:false"> <filter> <filter-name>cross-origin</filter-name> <filter-class>org.mortbay.servlets.CrossOriginFilter</filter-class> <init-param> <param-name>allowedOrigins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>allowedMethods</param-name> <param-value>GET,POST</param-value> </init-param> <init-param> <param-name>allowedHeaders</param-name> <param-value>x-requested-with,content-type</param-value> </init-param> </filter> <filter-mapping> <filter-name>cross-origin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<span>I was looking on Geoserver cross domain support (no-proxy) recently and I managed to get it working by compiling custom filter for Jetty 6.1.8. The filter is based on CrossOriginFilter which is supplied with newer versions of jetty-servlets.jar. I have fixed some white-space bugs and tested it with OpenLayers 2.12, IE, FF and Chrome. You can follow the same rules as described here: http://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter but: 1.Do not include the jar. Instead, put content of this archive http://shanbe.hezoun.com/cors.zip into the <geoserver>\webapps\geoserver\WEB-INF\classes folder. 2. use <filter-class>org.mortbay.servlets.CrossOriginFilter</filter-class> insteand of <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 3. do not use additional spaces in allowedHeaders defs (like this: "x-request-with, content-type") You can put follwing conf. inside the <geoserver>\webapps\geoserver\web.xml to allow CORS requests from all domains: <filter> <filter-name>cross-origin</filter-name> <filter-class>org.mortbay.servlets.CrossOriginFilter</filter-class> <init-param> <param-name>allowedOrigins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>allowedMethods</param-name> <param-value>GET,POST</param-value> </init-param> <init-param> <param-name>allowedHeaders</param-name> <param-value>x-requested-with,content-type</param-value> </init-param> </filter> ... <filter-mapping> <filter-name>cross-origin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ..restart the geoserver and it should work.</geoserver></geoserver></span>