CORS跨域问题常用解决方法代码实例

 更新时间:2020年11月16日 10:49:39   作者:侯赛雷  
这篇文章主要介绍了CORS跨域问题常用解决方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一 后端服务器使用过滤器

新建过滤器:

/**
 * 解决跨域
 */
public class AccessControlAllowOriginFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException { }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("解决跨域请求");
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    response.setHeader("Access-Control-Allow-Origin", "*");//允许所有网站跨域访问
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Allow-Credentials", "true");    //这里如果前端请求header首字母是小写也是不行得,所以大小写都写上就没问题了
    response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin,content-type,x-requested-with,Content-Type,Access-Control-Allow-Headers,Content-Length,Accept,Authorization,X-Requested-With");
    filterChain.doFilter(servletRequest, response);
  }

  @Override
  public void destroy() {}
}

前端header需要添加:

$.ajax( {
      url : 'http://c2.zhuzher.com/pdm/know/active?hotelid=808047&sdate=2019-11-09&edate=2019-11-11',
      beforeSend: function (xhr) {
          xhr.setRequestHeader("Access-Control-Allow-Origin", "*"); //设置跨域访问信息
          xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
      },
      type : 'get',
      dataType : 'json',
      data:{},
      success : function(data) {
        alert(1111);
      }
    });

二 后端接口springboot/springmvc使用注解

springMVC的版本要在4.2或以上版本才支持@CrossOrigin ;

方法需要指明Get或者POST才行:

三 本地nginx反向代理(推荐)

本地下载解压nginx,添加一个server配置文件:

注意,如果是放在nginx的html目录下一般是不需要加跨域配置的,否则会报配置多余错误

每次可先直接使用试试,不行再加下面add_header等配置.

###start跨域支持配置####
  add_header Access-Control-Allow-Origin '*';
  add_header Access-Control-Allow-Headers Accept,Origin,X-Requested-With,Content-Type,If-Modified-Since,Last-Modified,Content-Length,Content-Range,Range,Content-Description,Content-Disposition;
  add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
  add_header Access-Control-Request-Headers Content-Disposition;
  add_header Access-Control-Allow-Credentials true;

  ###end ###

  server {
    listen    80;
    server_name 127.0.0.1;

    #charset koi8-r;

    #access_log logs/host.access.log main;

    location / {
      root  html;
      index index.html index.htm;
    }
    
    #自定义本地路径,代理转发请求
    location /pdm    {
      proxy_pass  http://c2.zhuzher.com/pdm;
    }

  }
  
  server {
    listen    8081;
    server_name 127.0.0.1;

    #charset koi8-r;

    #access_log logs/host.access.log main;

    location / {
      root  html;
      index index.html index.htm;
    }
    
    #自定义本地路径,代理转发请求
     location /pdm    {
      proxy_pass http://c2.zhuzher.com/pdm;
      charset utf-8;
      #  proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;    
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

项目里面直接调用配置的8081端口就可以了:

api.get('//localhost:8081/pdm/user/login',data)

注意这里还有一点需要注意,如果Content-Type是 application/json的话是无法发送跨域请求的,这里提供一种解决办法,就是接口前端请求type改成

'Content-Type':'text/plain'

发送数据转成字符串:

JSON.stringify(data)

后端接口用String接受数据,然后再转成对象就可以了:

@PostMapping("/distributeBatch")
  public ResMsg distributeSaleBatch(@RequestBody String params){
    System.out.println(params);
    //Integer user_id, Integer customer_id
    //Gson 字符串转对象
    List<Map<String, Integer>> fromJson = new Gson().fromJson(params, new TypeToken<List<Map<String, Integer>>>() {
    }.getType());
    System.out.println(new Gson().toJson(fromJson));
    return registeredCustomerService.distributeSaleBatch(fromJson);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot中使用rabbitt的详细方法

    springboot中使用rabbitt的详细方法

    这篇文章主要介绍了springboot中使用rabbitt,通过本文学习让我们了解如何在Spring Boot中使用RabbitMQ,并使用不同的交换机和队列类型以及消息确认模式,需要的朋友可以参考下
    2023-05-05
  • 关于SpringBoot mysql数据库时区问题

    关于SpringBoot mysql数据库时区问题

    在后端开发过程中经常会遇到几个时区设置问题,今天分几种情况给大家介绍SpringBoot mysql数据库时区问题,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • IDEA中的yml文件与properties互相转换

    IDEA中的yml文件与properties互相转换

    这篇文章主要介绍了IDEA中的yml文件与properties互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • json-lib将json格式的字符串,转化为java对象的实例

    json-lib将json格式的字符串,转化为java对象的实例

    下面小编就为大家带来一篇json-lib将json格式的字符串,转化为java对象的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    这篇文章主要介绍了Java基础开发之JDBC操作数据库增删改查,分页查询实例详解,需要的朋友可以参考下
    2020-02-02
  • Java如何使用命令查看内存占用情况

    Java如何使用命令查看内存占用情况

    jhat是一个用于分析Java堆转储文件的工具,通过启动Web服务器并加载堆转储文件,可以在浏览器中查看占用最多内存的类及其详细信息
    2025-02-02
  • Spring Cache抽象-使用SpEL表达式解析

    Spring Cache抽象-使用SpEL表达式解析

    这篇文章主要介绍了Spring Cache抽象-使用SpEL表达式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • IDEA 2019.2.3破解激活教程(亲测有效)

    IDEA 2019.2.3破解激活教程(亲测有效)

    这篇文章主要介绍了IDEA 2019.2.3破解激活教程(亲测有效),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java IPage分页操作 附加自定义sql

    Java IPage分页操作 附加自定义sql

    这篇文章主要介绍了Java IPage分页加自定义sql,主要包括引入依赖,impl常规操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Java中实现树形菜单的两种方式

    Java中实现树形菜单的两种方式

    这篇文中,我一共会用两种方式来实现目录树的数据结构,两种写法逻辑是一样的,只是一种适合新手理解,一种看着简单明了但是对于小白不是很好理解,在这里我会很详细的讲解每一步代码,主要是方便新人看懂,弥补曾经自己学习过程中的苦恼,需要的朋友可以参考下
    2023-09-09

最新评论