zoukankan      html  css  js  c++  java
  • 跨域资源共享(CORS)问题解决方案

    CORS:Cross-Origin Resource Sharing(跨域资源共享)

    CORS被浏览器支持的版本情况如下:Chrome 3+、IE 8+、Firefox 3.5+、Opera 12+、Safari 4+

    问题描述:A域中的脚本请求B域中的资源出现这种问题

    报错信息:

    XMLHttpRequest cannot load http://localhost:8082/servletdemo/doTest. No 'Access-Control-Allow-Origin' header is present on the requested resource. 

    Origin 'http://localhost:8080' is therefore not allowed access.

    问题分析:

    两个不同的域之间发送请求,浏览器出于安全因素考虑,所以不允许这种访问。

    Cross-Origin Resource Sharing (CORS) is a specification that enables truly open access across domain-boundaries. If you serve public content,

    please consider using CORS to open it up for universal JavaScript/browser access.

    Granting JavaScript clients basic access to your resources simply requires adding one HTTP Response Header, namely:

    Access-Control-Allow-Origin: *
    Access-Control-Allow-Origin: http://example.com:8080/

    问题解决:

    以下提供几种解决方法,根据实际情况选择

    一、容器层面,影响范围是容器下的所有webapp应用

    in tomcat/conf/web.xml ex:

    <filter>
          <filter-name>CorsFilter</filter-name>
      <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>CorsFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    ps:这个过滤器只针对apache-tomcat-7.0.41及以上版本。

    二、单个应用,只作用于这个项目本身

    in webapp/WEB-INF/web.xml
    <filter>
      <filter-name>CorsFilter</filter-name>
      <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>CorsFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    三、一组资源层面,作用于指定Filter过滤的全部请求资源

    Filter方法代码 ex:
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;
      res.addHeader("Access-Control-Allow-Origin", "*");
      res.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
      res.addHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires,   Content-Type, X-E4M-With");
      chain.doFilter(req, res);
    }

    四、单个资源层面,只针对某一个资源

    Servlet方法代码 ex:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setHeader("Access-Control-Allow-Origin","*");
      PrintWriter out = response.getWriter();
      out.write("{/"key/":/"value/"}");
      out.flush();
      out.close();
    }

    其中spring framework在4.2及以上支持cors注解,可参考https://spring.io/blog/2015/06/08/cors-support-in-spring-framework;

    另一种https://spring.io/guides/gs/rest-service-cors/

    五、针对单兵开发,我们原型maven-Archetype-wepapp提供两种支持

    tomcat7-maven-plugin
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <path>/servletdemo</path>
        <port>8082</port>
        <server>tomcat</server>
        <url>http://localhost:8080/manager/text</url>
      <!-- Enable CORS -->
      <tomcatWebXml>src/test/resources/tomcat.web.xml</tomcatWebXml>
      </configuration>
    </plugin>

    jetty-maven-plugin
    <plugin>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>9.3.2.v20150730</version>
      <configuration>
        <scanIntervalSeconds>10</scanIntervalSeconds>
      <webApp>
        <contextPath>/servletdemo</contextPath>
        <!--Fix file locking problem with jettyrun Enable CORS-->
        <defaultsDescriptor>src/test/resources/jetty.web.xml</defaultsDescriptor>
      </webApp>
      <httpConnector>
        <!-- mvn -Djetty.port=8082 jetty:run -->
        <port>8082</port>
      </httpConnector>
      </configuration>
    <dependencies>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlets</artifactId>
      <version>9.3.2.v20150730</version>
      </dependency>
    </dependencies>
    </plugin>

  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/hxb2015/p/4605825.html
Copyright © 2011-2022 走看看