IOS APP跨域问题处理

原理:发生 跨域请求时,分二个请求,第一次请求叫 嗅探请求,prefight请求,也就是http OPTIONS请求,成功之后再进行真正的请求,这两次请求都是代码写的,浏览器不做options请求。

tomcat服务器需要做请求头返回和options请求处理:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
           FilterChain chain) throws IOException, ServletException {
           if (encoding == null) {
               encoding = config.getInitParameter("encoding");
           }
           servletRequest.setCharacterEncoding(encoding);
           servletResponse.setCharacterEncoding(encoding);
           
           HttpServletRequest request = (HttpServletRequest) servletRequest;
           HttpServletResponse response = (HttpServletResponse) servletResponse;
           response.setHeader("Access-Control-Allow-Origin", "*");
           response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
           response.setHeader("Access-Control-Max-Age", "3600");
           
           /**cors modified start**/
           StringBuilder headers = new StringBuilder();
           Enumeration<String> headerNames = request.getHeaders("Access-Control-Request-Headers");
           if(Objects.nonNull(headerNames)) {
               while (headerNames.hasMoreElements()) {
                   headers.append(headerNames.nextElement()).append(",");
               }
           }
           response.setHeader("Access-Control-Allow-Headers", headers.toString());
           /**cors modified end**/
           
           
           if ("options".equalsIgnoreCase(request.getMethod())) {
               response.setStatus(204);
           } else {
               chain.doFilter(request, response);
           }
           
           log.warn("url=" + ((HttpServletRequest)request).getRequestURL()+",method="+((HttpServletRequest)request).getMethod());
    }

Nginx服务器请求处理:

server {
    listen       9000 ssl;
    listen       [::]:9000 ssl;
    root         /usr/share/nginx/html;
    ssl_certificate s1cert.pem;
    ssl_certificate_key s1cert.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_prefer_server_ciphers on;
    add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
    add_header X-Frame-Options  "ALLOW-FROM http://stand.alone.version/";
    add_header Access-Control-Max-Age 3600;
   # add_header X-Content-Type-Options nosniff;
   location / {
        if ($request_method = 'OPTIONS') {
          return 204;
       }
        proxy_pass http://172.19.0.2:80;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
 

prefight请求原理:

举个例子,一个客户端可能会在实际发送一个 DELETE 请求之前,先向服务器发起一个预检请求,用于询问服务器是否可以接收一个 DELETE 请求:

OPTIONS /resource/foo
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: origin, x-requested-with
Origin: https://foo.bar.org

如果服务器允许,那么服务器就会响应这个预检请求。并且其响应首部 Access-Control-Allow-Methods 会将 DELETE 包含在其中:

HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400

参考说明:

Preflight request - 术语表 | MDN

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp 是一款支持多个平台的跨端开发框架,它可以将一份代码同时转化成可以运行在多个平台上的应用程序,包括 iOS、Android、H5 等平台。 在前端开发中,H5 平台是最为常见的一种平台,因为它可以直接在浏览器上运行,无需安装应用程序。如果你要解决 UniApp 前端开发中的 H5 跨域问题,你可以通过以下几种方式来进行配置: 1. 通过设置 App.vue 文件中的 meta 标签,指定 H5 应用程序的访问权限,如下所示: ```html <meta http-equiv="Content-Security-Policy" content="default-src *;img-src * data:"> ``` 这段代码中的 Content-Security-Policy 指定了 H5 应用程序的默认源和图像源,其中 * 表示允许所有源进行访问,data: 表示允许使用 data 协议访问图像资源。 2. 通过在 uni-config.json 配置文件中添加 devServer 字段,指定跨域的代理配置,如下所示: ```json { "devServer": { "proxy": { "/api": { "target": "http://localhost:3000", "changeOrigin": true, "pathRewrite": { "^/api": "" } } } } } ``` 这段代码中的 proxy 配置可以将所有以 /api 开头的请求代理到指定的目标地址,同时修改请求头中的 origin 字段,避免跨域问题。 3. 通过在 uni-app 的 manifest.json 文件中添加配置,指定 H5 应用程序的访问域名,如下所示: ```json { "h5": { "devServer": { "port": 8080, "host": "localhost", "publicPath": "/", "disableHostCheck": true }, "router": { "mode": "hash", "base": "/" }, "appPlus": { "useweweb": false, "enableWKWebview": false }, "app": { "name": "uni-app", "theme": "#000000", "backgroundColor": "#f7f7f7", "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#ffffff", "navigationBarTitleText": "uni-app", "navigationBarTextStyle": "black", "navigationStyle": "default", "enablePullDownRefresh": false, "onReachBottomDistance": 50 }, "mp": {}, "tt": {} } } ``` 在上述代码中,我们可以通过设置 devServer.host 字段来指定 H5 应用程序的访问域名,从而避免跨域问题。 以上是我为你提供的三种解决 UniApp 前端开发中 H5 跨域问题的方法,希望可以对你有所帮助。如果你还有其他问题,欢迎继续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值