2017-07-29 53 views
0

我嘗試解決將請求發送到我的GeoServer時遇到的錯誤403 Forbidden。爲了調試這個過程,我使用Chrome中的Inspect選項中的Network選項卡(我也試過Firefox)。這是我在網絡標籤中看到的錯誤。使用CORS並解決問題403禁止的錯誤

的XMLHttpRequest不能加載 http://localhost:8080/geoserver/square/ows?service=WFS&version=1.1.0&requ ... TURE &的typeName =正方形:InformationStores & OUTPUTFORMAT =應用%2Fjson。 對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在「訪問控制 - 允許來源」標頭。 'http://localhost:5601'因此不允許 訪問。響應的HTTP狀態碼爲403.

我的GeoServer 2.10.4是根據我在這個主題上找到的多個教程啓用的CORS。但是,我收到的錯誤消息似乎與代理有關。

我花了很多時間試圖解決這個問題,所以最後,我絕對失去了。我嘗試了很多東西,但都沒有成功。

這是的GeoServer的配置文件,這是我送的請求:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> 
    <display-name>GeoServer</display-name> 

     <context-param> 
    <param-name>serviceStrategy</param-name> 
    <!-- Meaning of the different values : 

     PARTIAL-BUFFER2 
     - Partially buffers the first xKb to disk. Once that has buffered, the the 
      result is streamed to the user. This will allow for most errors to be caught 
      early. 

     BUFFER 
     - stores the entire response in memory first, before sending it off to 
      the user (may run out of memory) 

     SPEED 
     - outputs directly to the response (and cannot recover in the case of an 
      error) 

     FILE 
     - outputs to the local filesystem first, before sending it off to the user 
     --> 
    <param-value>PARTIAL-BUFFER2</param-value> </context-param> 
    <context-param> 
    <!-- see comments on the PARTIAL-BUFFER strategy --> 
    <!-- this sets the size of the buffer. default is "50" = 50kb --> 

    <param-name>PARTIAL_BUFFER_STRATEGY_SIZE</param-name> 
    <param-value>50</param-value> </context-param> 
    <!--Can be true or false (defaults to: false). --> <!--When true the JSONP (text/javascript) output format is enabled --> <!-- <context-param> 
    <param-name>ENABLE_JSONP</param-name> 
    <param-value>true</param-value> </context-param> --> 
    <!-- 
    <context-param> 
     <param-name>PROXY_BASE_URL</param-name> 
     <param-value>http://localhost/geoserver</param-value> 
    </context-param> 
    --> 

    <!-- 
    <context-param> 
     <param-name>GEOSERVER_DATA_DIR</param-name> 
     <param-value>C:\eclipse\workspace\geoserver_trunk\cite\confCiteWFSPostGIS</param-value> 
    </context-param>  --> 

    <!-- pick up all spring application contexts --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:/applicationContext.xml classpath*:/applicationSecurityContext.xml</param-value> 
    </context-param> 

    <filter> 
    <filter-name>FlushSafeFilter</filter-name> 
    <filter-class>org.geoserver.filters.FlushSafeFilter</filter-class> 
    </filter> 

    <filter> 
     <filter-name>Set Character Encoding</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
     </init-param> 
    </filter> 

    <filter> 
    <filter-name>SessionDebugger</filter-name> 
    <filter-class>org.geoserver.filters.SessionDebugFilter</filter-class> 
    </filter> 

    <filter> 
    <filter-name>filterChainProxy</filter-name>  
    <filter-class> org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter> 
     <filter-name>xFrameOptionsFilter</filter-name> 
     <filter-class>org.geoserver.filters.XFrameOptionsFilter</filter-class> 
    </filter> 

    <filter> 
    <filter-name>GZIP Compression Filter</filter-name> 
    <filter-class>org.geoserver.filters.GZIPFilter</filter-class> 
    <init-param> 
     <!-- The compressed-types parameter is a comma-separated list of regular expressions. 
       If a mime type matches any of the regular expressions then it will be compressed. 
       --> 
     <param-name>compressed-types</param-name> 
     <param-value>text/.*,.*xml.*,application/json,application/x-javascript</param-value> 
    </init-param> </filter> 

    <filter> 
    <filter-name>Request Logging Filter</filter-name> 
    <filter-class>org.geoserver.filters.LoggingFilter</filter-class> 
    <init-param> 
     <!-- The 'enabled' parameter is a boolean value, "true" (case-insensitive) for true or 
       any other value for false. If enabled, then the logging will be performed; 
       otherwise the logging filter will have no effect. If not specified, this 
       parameter defaults to false. 
       --> 
     <param-name>enabled</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
    <!-- The 'log-request-bodies' parameter is a boolean value, "true" (case-insensitive) for 
      true or any other value for false. If enabled, then the logging will include the body 
      of POST and PUT requests. If not specified, this parameter defaults to false. 
      Note that this may noticeably degrade responsiveness of your geoserver since it will 
      not begin to process requests until the entire request body has been received by the 
      server. 
      --> 
    <param-name>log-request-bodies</param-name> 
    <param-value>false</param-value> 
    </init-param> </filter> 
     <filter> 
    <filter-name>Advanced Dispatch Filter</filter-name> 
    <filter-class>org.geoserver.platform.AdvancedDispatchFilter</filter-class> 
    <!-- 
    This filter allows for a single mapping to the spring dispatcher. However using /* as a mapping 
    in a servlet mapping causes the servlet path to be "/" of the request. This causes problems with 
    library like wicket and restlet. So this filter fakes the servlet path by assuming the first 
    component of the path is the mapped path. 
    --> </filter> 
     <filter> 
    <filter-name>Spring Delegating Filter</filter-name> 
    <filter-class>org.geoserver.filters.SpringDelegatingFilter</filter-class> 
    <!-- 
    This filter allows for filters to be loaded via spring rather than 
    registered here in web.xml. One thing to note is that for such filters 
    init() is not called. INstead any initialization is performed via spring 
    ioc. 
    --> </filter> 
     <filter> 
    <filter-name>Thread locals cleanup filter</filter-name> 
    <filter-class>org.geoserver.filters.ThreadLocalsCleanupFilter</filter-class> 
    <!-- 
    This filter cleans up thread locals Geotools is setting up for concurrency and performance 
    reasons 
    --> </filter> <!-- Uncomment following filter to enable CORS --> <filter> 
     <filter-name>cross-origin</filter-name> 
     <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    </filter> 

    <!-- 
     THIS FILTER MUST BE THE FIRST ONE, otherwise we end up with ruined chars in the input from the GUI 
     See the "Note" in the Tomcat character encoding guide: 
     http://wiki.apache.org/tomcat/FAQ/CharacterEncoding 
    --> 
    <filter-mapping> 
     <filter-name>Set Character Encoding</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
     <!-- Uncomment following filter to enable CORS --> 
    <filter-mapping> 
     <filter-name>cross-origin</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>FlushSafeFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>SessionDebugger</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>GZIP Compression Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>xFrameOptionsFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>Request Logging Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- 
     If you want to use your security system comment out this one too 
    --> 
    <filter-mapping> 
     <filter-name>filterChainProxy</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>Advanced Dispatch Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>Spring Delegating Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <filter-mapping> 
     <filter-name>Thread locals cleanup filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- general initializer, should be first thing to execute --> 
    <listener> 
     <listener-class>org.geoserver.GeoserverInitStartupListener</listener-class> 
    </listener> 

    <!-- logging initializer, should execute before spring context startup --> 
    <listener> 
     <listener-class>org.geoserver.logging.LoggingStartupContextListener</listener-class> 
    </listener> 

    <!-- spring context loader --> 
    <listener> 
     <listener-class>org.geoserver.platform.GeoServerContextLoaderListener</listener-class> 
    </listener> 

    <!-- http session listener proxy --> 
    <listener> 
     <listener-class>org.geoserver.platform.GeoServerHttpSessionListenerProxy</listener-class> 
    </listener> 

    <!-- request context listener for session-scoped beans --> <listener>  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  </listener> 

    <!-- spring dispatcher servlet, dispatches all incoming requests --> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    </servlet> 

    <!-- single mapping to spring, this only works properly if the advanced dispatch filter is 
     active --> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <mime-mapping> 
     <extension>xsl</extension> 
     <mime-type>text/xml</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>sld</extension> 
     <mime-type>text/xml</mime-type> 
    </mime-mapping> 
    <mime-mapping> 
     <extension>json</extension> 
     <mime-type>application/json</mime-type> 
    </mime-mapping> 

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
    </web-app> 
+0

請檢查這一點,我相信你有同樣的問題 https://gis.stackexchange.com/questions/210316/access-control-allow-origin-openlayers-wfs – 2oppin

+0

@ 2oppin:謝謝,但這是正是我所做的(很多次!)。所以,我加入' 跨來源 <濾波器級> org.eclipse.jetty.servlets.CrossOriginFilter <濾波器映射> 橫原始 /* 到GeoServer的web.xml中,我把適當版本的jetty jar放到'WEB-INF/lib'中。 – Dinosaurius

+0

我不知道geoServer,但我想它可能是通過其他一些http服務器設置的。你使用碼頭嗎?我想根據服務器apache/tomcat/jetty他們都使用他們自己的過濾器, 如果你有一些自定義的服務器與春天建立,那麼你應該手動添加標頭 – 2oppin

回答

0

請參閱我的回答這個question

而不是添加到web.xml,只需取消註釋兩個 CORS相關的塊已在那裏。

+0

我做了不同的版本Geoserver的:)它沒有工作。對我來說,它只能在Apache Tomcat上使用Catalina而不是Jetty。 – Dinosaurius

+0

我昨天用2.10.3做的,它工作正常 –

+0

你用Kibana測試過嗎? – Dinosaurius