react+spring 记录跨域问题的解决方法

cq-jiang 2018-08-28 原文

react+spring 记录跨域问题的解决方法

react 跨域访问后台,默认是有跨域问题,并且火弧和谷歌浏览器,对跨域问题展示还不一样.

谷歌浏览器如下图:

此处状态是200,然而在Response却没有任何信息,如下图

 

然而火弧浏览器,对该问题的描述,就清淅得多,

火弧浏览器告诉我们,跨域了,关于react跨域的帖子,网上也有相关帖子,搜索到的方法,大约都是如下解决方式:

如果你是通过creat-react-app构建的项目,请在package.json文件中的根目录下,添加”proxy”: “http://api.xxxx.com”,如果你的项目,需要调用多个不同ip的接口,请使用如下配置:

"proxy": {
        "/api/RoomApi": {
          "target": "http://open.douyucdn.cn",
          "changeOrigin":true
        },
        "/api/v1":{
          "target":"http://capi.douyucdn.cn",
          "changeOrigin":true
        }
      }

配置完成后,再次访问接口,还是出现一样的跨域问题,既然recat的配置,未解决跨域问题,我就把思路转到spring,在spring去处理跨域,

package com.gg.interceptor;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class ProcessInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler)
            throws Exception {
        // TODO Auto-generated method stub 
        // 指定白名单域名   http://localhost:8000,http://localhost:8000
        List<String> whileList  = new Vector<String>(); 
        whileList.add("http://127.0.0.1:8000");
        whileList.add("http://localhost:8000");
        String clientIp = httpServletRequest.getHeader("origin");
        boolean status = false;
        for(String ip : whileList) {
            if(clientIp!=null&&clientIp.equals(ip)) {
                status = true;
                break;
            }
        }
        /**
         * 网上解决方案是httpServletResponse.setHeader("Access-Control-Allow-Origin","*");设置后发现,还是不能处理跨域问题,需要指定某一个ip,如:http://127.0.0.1:8000  
         * */
        httpServletResponse.setHeader("Access-Control-Allow-Origin",status?clientIp:null);  
        //响应头设置  
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");  
        //响应类型
        httpServletResponse.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  
        httpServletResponse.setHeader("X-Powered-By","Jetty");  
        httpServletResponse.setHeader("Access-Control-Allow-Credentials","true");
        String method= httpServletRequest.getMethod();  
        if (method.equals("OPTIONS")){  
            httpServletResponse.setStatus(200);  
            return false;  
        }  
  
        System.out.println(method+",status:"+status+",clientIp:"+clientIp);  
  
        return true;  
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        
    }

}

react客户端代码如下:

Model层js代码:
*login({ payload }, { call, put }){
      let formData = new FormData();
      formData.append("loginId",payload.loginId);//账号
      formData.append("passWord",payload.passWord);//密码
      const response = yield call(requestGuangGao, formData); 
      yield put({
        type: 'changeLoginStatus',
        payload: response,
      });
    },

api层js代码:
export async function requestGuangGao(formData){
  // let formData = new FormData();
  // formData.append("loginId",params.loginId);
  // formData.append("passWord",params.passWord);

  console.log("requestGua   >url  :" );
   return request('http://127.0.0.1:8080/guanggao/userController/login.do', {
    method: 'POST', 
    mode: 'cors', 
    body:formData,
  });   
}

通过以下设置,react跨域问题就处理好了。

 

dependencies
发表于 2018-08-28 14:52 喝着啤酒写bug 阅读() 评论() 编辑 收藏

 

版权声明:本文为cq-jiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cq-jiang/p/9548197.html

react+spring 记录跨域问题的解决方法的更多相关文章

  1. react 模拟从后台获取菜单数据,点击顶部菜单切换界面的笔记

    react 模拟从后台获取菜单数据,点击顶部菜单切换界面的笔记  本文是基于Ant design Pro 2. […]...

随机推荐

  1. getImplementationVersion-获取版本号

      在工作中会遇到这个方法的使用,就记录一下。 一:getImplementationVersion 1.  […]...

  2. C# Xml Linq XDocument 基本操作 — 重新学习

    person.xml <?xml version="1.0" encoding="utf-8"?> […]...

  3. ThinkPad t480s 电源接口进水了

      ThinkPad t480s 电源接口进水了,充不进电了 朋友电脑进了水,换了充电器也不好使,后来考虑是烧 […]...

  4. 集合ArrayList分析

    目录 ArrayList 描述 重要的对象 遍历使用 与Collection关系 ArrayList属性 扩展 […]...

  5. 代码作家Alpha冲刺阶段博客目录

    一、Scrum Meeting 1. [第六周会议记录] 2. [第七周会议记录] 二、测试报告 Alpha阶 […]...

  6. 职业生涯之完成OCM考试后的感想 – AlfredZhao

    职业生涯之完成OCM考试后的感想 2019-07-11 22:13  AlfredZhao  阅读(4072) […]...

  7. jqGrid复制表格数据到另外一张表中 – WendyQQ35

    jqGrid复制表格数据到另外一张表中 var selectedIds = $("#jqGrid_choose […]...

  8. Hashmap实现原理

    Hashmap实现原理 1.HashMap的数据结构   数组的特点是:寻址容易,插入和删除困难;而链表的特点 […]...

展开目录

目录导航