美文网首页
GeoServer跨域处理

GeoServer跨域处理

作者: AC编程 | 来源:发表于2024-09-22 15:58 被阅读0次

    一、修改web.xml开放cross-origin配置

    我本地服务web.xml路径为:C:\Program Files\GeoServer\webapps\geoserver\WEB-INF\web.xml
    在文件空行中(如大约150行左右)直接添加以下配置

    <filter>
          <filter-name>cross-origin</filter-name>
          <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
          <init-param>
            <param-name>chainPreflight</param-name>
            <param-value>false</param-value>
          </init-param>
          <init-param>
            <param-name>allowedOrigins</param-name>
            <param-value>*</param-value>
          </init-param>
          <init-param>
            <param-name>allowedMethods</param-name>
            <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
          </init-param>
          <init-param>
            <param-name>allowedHeaders</param-name>
            <param-value>*</param-value>
          </init-param>
    </filter>
    <filter-mapping>
        <filter-name>cross-origin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    web.xml完整配置如下:

    <?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://82.58.146.45/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>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 in Jetty. Do not forget the second config block further down.
        <filter>
          <filter-name>cross-origin</filter-name>
          <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
          <init-param>
            <param-name>chainPreflight</param-name>
            <param-value>false</param-value>
          </init-param>
          <init-param>
            <param-name>allowedOrigins</param-name>
            <param-value>*</param-value>
          </init-param>
          <init-param>
            <param-name>allowedMethods</param-name>
            <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
          </init-param>
          <init-param>
            <param-name>allowedHeaders</param-name>
            <param-value>*</param-value>
          </init-param>
        </filter>
        -->
    
    
        <filter>
          <filter-name>cross-origin</filter-name>
          <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
          <init-param>
            <param-name>chainPreflight</param-name>
            <param-value>false</param-value>
          </init-param>
          <init-param>
            <param-name>allowedOrigins</param-name>
            <param-value>*</param-value>
          </init-param>
          <init-param>
            <param-name>allowedMethods</param-name>
            <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
          </init-param>
          <init-param>
            <param-name>allowedHeaders</param-name>
            <param-value>*</param-value>
          </init-param>
        </filter>
        <filter-mapping>
            <filter-name>cross-origin</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
       <!-- Uncomment following filter to enable CORS in Tomcat. Do not forget the second config block further down.
        <filter>
          <filter-name>cross-origin</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,PUT,DELETE,HEAD,OPTIONS</param-value>
          </init-param>
          <init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>*</param-value>
          </init-param>
        </filter>
        -->
    
        <!--
          THIS FILTER MAPPING 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>
    
        <!--
          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>
    
    

    二、找到GeoServer对应版本的jetty-servlets和jetty-util的jar文件

    2.1 首先我们确认下载的GeoServer版本,如下
    geoserver版本

    在github上查看geoserver源码pom相关版本配置信息,以2.23.2为例:

    https://github.com/geoserver/geoserver/blob/2.23.2/src/pom.xml

    GeoServer pom.xml配置

    通过GeoServer服务pom.xml配置,我们可以查看到jetty版本号为9.4.51.v20230217

    2.2 在maven上下载jetty-servlets和jetty-util的jar文件

    打开maven地址: https://mvnrepository.com/

    maven地址

    以下载jetty-servlets为例,jetty-util同理。搜索jetty-servlets并选择进入jetty-servlets版本页面

    jetty-servlets jetty-servlets版本 jetty-servlets下载

    jetty-servlets和jetty-util下载到本地后,如下图所示:


    image.png

    三、将jetty-servlets和jetty-util的jar包拷贝到geoserver下的lib目录

    将jetty-servlets和jetty-util的jar包拷贝到geoserver下的lib目录。

    我本地服务的路径为:C:\Program Files\GeoServer\webapps\geoserver\WEB-INF\lib

    四、重启GeoServer

    重启GeoServer,解决跨域。

    重启GeoServer

    本文转载自:geoserver完美跨域解决方式(2024版)

    相关文章

      网友评论

          本文标题:GeoServer跨域处理

          本文链接:https://www.haomeiwen.com/subject/vvxxrjtx.html