Web开发跨域问题解决方案——前端Vue、前端JQuery、后端Java、PHP、其他

前端Vue(axios)解决方案

vue/cli 3+
项目根目录下(不是src目录下)新建文件 “vue.config.js”

后端接口例子(user相关接口):
https://127.0.0.1:5555/user/login
https://127.0.0.1:5555/user/register
https://127.0.0.1:5555/user/getuserinfo

// vue.config.js
// 实现原理:代理
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'https://127.0.0.1:5555', // 你的服务端请求地址
        changeOrigin: true,
        pathRewrite: {
          '^/api': '' // 重写url,将url中的 '/api' 替换掉
        }
      }
    }
  }
};
// axios
const baseUrl = https://127.0.0.1:6666 // 生产环境url
// 将开发环境的 'baseUrl' 设置为 '/api'
axios.defaults.baseURL = process.env.NODE_ENV === "production" ? baseUrl : "/api"
// 调用接口
axios({
	url: '/user/login' // '/user/register'  '/user/getuserinfo',
	// .... 其他配置
}).then(res => {
	console.log(res)
})

前端JQuery+后端解决方案

JQuery 解决方案主要是通过jsonp方式,需要结合后端实现

  • 前端
$.ajax({
	type: 'get',
	url: 'https://127.0.0.1:5555/user/getuserinfo',
	dataType: 'JSONP',
	jsonpCallback: 'callback_string', // callback字符串,不设置则随机
	success: function(res){
		console.log(res)
	},
	error: function(err){
		console.error(err)
	}
})
  • 后端(Java-SpringMVC)

返回的数据用callback包裹

// UserController
public String getUserInfo(String username, String callback) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonData = objectMapper.writeValueAsString(userService.getUserInfo(username));
    String jsonpData = callback + "(" + jsonData + ")";
    return jsonpData;
}

Java后端解决方案

// Java-SpringBoot
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
public class GlobalCorsConfiguration implements Filter {
    @Override
    public void init(FilterConfig filterConfig) {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 配置 "*" 无效的话,就填写指定地址(报错是因为不允许用 "*" 配置)
        response.setHeader("Access-Control-Allow-Origin","*");
        response.setHeader("Access-Control-Allow-Credentials","true");
        response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,PATCH,HEAD");
        response.setHeader("Access-Control-Allow-Max-Age","3600");
        response.setHeader("Access-Control-Allow-Headers","authorization,Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type");
        if("OPTIONS".equalsIgnoreCase(request.getMethod())){
            response.setStatus(HttpServletResponse.SC_OK);
        }else{
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

PHP后端解决方案

// 设置能访问的域名
static public $originarr = [
   'https://127.0.0.1:5555',
   'https://127.0.0.1:6666',
];
 
/**
 *  公共方法调用
 */
static public function setheader()
{
   // 获取当前跨域域名
   $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
   if (in_array($origin, self::$originarr)) {
      // 允许 $originarr 数组内的 域名跨域访问
      header('Access-Control-Allow-Origin:' . $origin);
      // 响应类型
      header('Access-Control-Allow-Methods:POST,GET');
      // 带 cookie 的跨域访问
      header('Access-Control-Allow-Credentials: true');
      // 响应头设置
      header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');
   }
}

后端其他解决方案

后端解决方案实质就是设置响应头,以实现跨域访问
其他后端语言解决方案类似以上java、php解决方案

写在最后

欢迎留言、私信、讨论;
文章有知识性错误请立马联系博主,博主将非常感谢;
无需经过允许即可随意使用转载,知识本来就是被广泛用来学习的;
非常感谢您能看到此处,本文为博主学习笔记,如有不同见解,请不吝赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码绘世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值