跨域解决方法

一、什么是跨域

跨域问题是由浏览器的同源策略引起的。同源策略是一种安全策略,它限制了一个页面从另一个源加载任何资源,包括脚本、样式、图片、iframe等。同源是指协议、域名、端口号都相同,如果不同则被认为是跨域。

二、为什么会跨域

跨域问题的出现是因为浏览器在发送跨域请求时会先向目标服务器发送一个OPTIONS请求,询问服务器是否允许跨域请求。如果服务器返回的响应中包含了Access-Control-Allow-Origin头部,表示允许跨域请求,浏览器才会发送真正的跨域请求。否则,浏览器会拒绝跨域请求,抛出跨域异常。

三、跨域解决方法

1.JSONP(JSON with Padding):是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。利用 <script>元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析;

jQuery代码

$.ajax({
    url: "http://127.0.0.1:3000/a/jsp/kytest.jsp",
    type: "GET",
    dataType: 'jsonp',
    success: function (retData, status) {
        console.log(retData, status)
    }
})

Java代码:将跨域请求的数据作为回调函数的参数返回到页面中。简单来说就是返回JS文本过去

String callback = request.getParameter("callback");
out.println(callback + "(" + jsonString + ")");

2.CORS(跨来源资源共享):CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。

response.setHeader("Access-Control-Allow-Origin", "*");

3.代理:服务器请求不受同源策略限制

①在项目编写代理接口,前端调用使用代理接口获取数据(在此使用的Jsp,工具包为hutool)

<%@ page import="cn.hutool.http.HttpUtil" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String Number = request.getParameter("Number");
    String name = request.getParameter("name");

    HashMap<String, Object> paramMap = new HashMap<>();
    paramMap.put("Number", Number);
    paramMap.put("name", name);

    String result1 = "";
    try {
        result1 = HttpUtil.get("http://127.0.0.1:8080/aaa/bbb", paramMap);
    } catch (Exception ignored) {
        result1 = "{\"msg\": \"请求超时!!\",\"success\": false}";
    }
    out.println(result1);
%>

②通过部署第三方代理(例如nginx等),这里不做过多追溯,见前面文章

总结:想解决浏览器跨域,方法一和方法二都需要后端支持,方法三自己搭建代理服务器也比较麻烦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值