【问题标题】:CORS issue POST request (403 Forbidden) of App Android generated with Sencha CMD 6.5CORS 发出使用 Sencha CMD 6.5 生成的 App Android 的 POST 请求(403 Forbidden)
【发布时间】:2018-02-07 11:29:46
【问题描述】:

我正在尝试使用 Sencha CMD 6.5 生成一个应用程序 Android(前端),该应用程序将请求发送到 Tomcat 服务器(后端)。

问题在于POST方法,当App在header中发送请求时,“Origin”参数设置为“file://”,tomcat的CORS拒绝请求(禁止403)。

标题

Accept: */*
Accept-Encoding: gzip,deflate
Accept-Language: en-US;q=0.9
Connection: keep-aliv(e)
Content-Length: 39
Host: 192.168.1.91: 8080
Origin: file: //
Referer: -
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0(Linux;Android7.0;MI5Build/NRD90M;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/64.0.3282.137MobileSafari/537.36

在tomcat 8.0的web.xml中定义的FILTER

<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>Cache-Control,Content-Language,Expires,Last-Modified,Pragma,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>

有趣的是,GET 方法没有在 Origin 参数中设置任何内容,而 Tomcat CORS 接受它。

只有两种解决方案:

  1. 设置参数Origin of header(我在任何论坛都没有找到,像这样,像senchaforum等)

  2. 修改 TOMCAT 8 的 CORS 过滤器。(我在任何论坛都没有找到任何东西,比如这个,比如 senchaforum 等)

【问题讨论】:

    标签: android tomcat post extjs cors


    【解决方案1】:

    解决方案是使用ContainerResponseFilter,而不是tomcat的filter。

    import javax.ws.rs.ext.Provider;
    import javax.ws.rs.container.ContainerRequestContext;
    import javax.ws.rs.container.ContainerResponseContext;
    import javax.ws.rs.container.ContainerResponseFilter;
    import javax.ws.rs.core.MultivaluedMap;
    
    @Provider
    public class CORSResponseFilter implements ContainerResponseFilter {
    
    @Override
    public void filter(ContainerRequestContext creq, ContainerResponseContext cres) {
    
        MultivaluedMap<String, Object> headers = cres.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", "Cache-Control,Content-Language,Expires,Last-Modified,Pragma,Content-Type,X-Requested-With,Accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers");
        headers.add("Access-Control-Allow-Credentials", "false");
        headers.add("Access-Control-Allow-Methods", "GET,POST,HEAD,OPTIONS,PUT");
        //headers.add("Access-Control-Max-Age", "10");
        }
    
    }
    

    我已经尝试过了,以防有人认为它可以与原始过滤器一起使用:

    <init-param>
          <param-name>cors.support.credentials</param-name>
          <param-value>false</param-value>
    </init-param>
    

    欢迎大家,希望以后能对大家有所帮助。

    丹尼尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 2013-08-21
      • 1970-01-01
      • 2020-08-25
      • 2022-01-17
      • 2013-04-15
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多