ajax跨域解决方案domain_js解决跨域问题

ajax跨域解决方案domain_js解决跨域问题简介JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。JavaScript的同源策略:只有协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。比如www.aa.com下的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

简介

JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。

JavaScript的同源策略:只有协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。比如www.aa.com下的一个页面,其中的ajax请求是不允许访问www.bb.com这样一个页面的。

跨域问题是针对JS和ajax的,html本身(比如a标签、script标签、甚至form标签(可以直接跨域发送数据并接收数据)等)没有跨域问题,。

跨域示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方案一:使用JSONP

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能。

示例:

  • 服务器端代码

    @WebServlet(urlPatterns = "/jsonServlet")
    public class JsonServlet extends HttpServlet { 
         
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
         
            PrintWriter out = response.getWriter();
            String cb = request.getParameter("cb");
            out.print(cb+"({\"name\":\"zhangsan\",\"age\":19});");
        }
    }
    
  • 客户端实现一:JavaScript实现

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>
    		<script type="text/javascript"> function fun(){ 
            window.location.href="http://localhost:8080/jsonServlet?cb=jsonpCallback"; } function jsonpCallback(json){ 
            alert("name:" + json.name + " age:" + json.age); } </script>
    		<!--script标签的src指向了另一个域http://localhost:8080/下的jsonServlet请求-->
    		<script type="text/javascript"src="http://localhost:8080/qhdfl/jsonServlet?cb=jsonpCallback"></script>
    	</head>
    	<body>
    		<button onclick="fun()">fun</button>
    	</body>
    </html>
    
  • 客户端实现二:JQuery的getJSON实现

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>
    		<script src="js/jquery.js"></script>
    		<script type="text/javascript"> $(function() { 
            $.getJSON("http://localhost:8080/qhdfl/jsonServlet?cb=?", function(json) { 
            alert("name:" + json.name + " age:" + json.age); }); }); </script>
    	</head>
    	<body>
    	</body>
    </html>
    
  • 客户端实现三:JQuery的jsonp实现

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script src="js/jquery.js"></script>
		<script type="text/javascript"> $(function(){ 
      $.ajax({ 
      type:"get", url:"http://localhost:8080/qhdfl/jsonServlet",//跨域URL dataType:"jsonp", //数据格式设置为jsonp jsonp:"cb", //自定义参数的名称 jsonpCallback:"jsonpCallback",//自定义回调函数名称 success:function(res){ 
     //成功的回调函数 alert("name:" + res.name + " age:" + res.age); } }); }); function jsonpCallback(json){ 
      alert(json); } </script>
	</head>
	<body>
	</body>
</html>

jsonp用来自定义参数名称:

  • 不指定该参数时,JQuery会自动传递一个callback参数到后台,成功后,回调success函数。
  • 指定该参数自定义参数名称时,后台需要指定接受通过jsonp冒号传递的函数名称。执行成功后,先执行jsonpCallback定义的回调函数,后执行success函数。

解决方案二:服务器端添加响应头

添加响应头,允许跨域

addHeader(Access-Control-Allow-Origin:*);//允许所有来源访问
addHeader(Access-Control-Allow-Method:POST,GET’);//允许访问的方式
  • 服务器端代码

    @WebServlet(urlPatterns = "/jsonServlet")
    public class JsonServlet extends HttpServlet { 
         
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
         
            /**设置响应头允许ajax跨域访问**/
            response.setHeader("Access-Control-Allow-Origin","*");
            /*星号表示所有的异域请求都可以接受,*/
            response.setHeader("Access-Control-Allow-Methods","GET,POST");
            PrintWriter out = response.getWriter();
            out.print("{\"name\":\"zhangsan\",\"age\":19}");
        }
    }
    
  • 客户端代码

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>
    		<script src="js/jquery.js"></script>
    		<script type="text/javascript"> $(function(){ 
            $.ajax({ 
            type:"get", url:"http://localhost:8080/qhdfl/jsonServlet",//跨域URL dataType:"json", //数据格式设置为json success:function(res){ 
           //成功的回调函数 alert("name:" + res.name + " age:" + res.age); } }); }); </script>
    	</head>
    	<body>
    	</body>
    </html>
    

解决方案三:使用代理方式

服务器A的test01.html页面想访问服务器B的后台action,返回“test”字符串,此时就出现跨域请求,浏览器控制台会出现报错提示,由于跨域是浏览器的同源策略造成的,对于服务器后台不存在该问题,可以在服务器A中添加一个代理action,在该action中完成对服务器B中action数据的请求,然后在返回到test01.html页面。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172552.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 根据eia/tia接线标准,简述双绞线的线序_rj45接线图

    根据eia/tia接线标准,简述双绞线的线序_rj45接线图今日看到一篇文章    〈巧识妙记双绞线〉原文:http://www.szerc.com/blog/more.asp?name=goodchun&id=3791 作者总结的两句口决真的很妙,不愧是工作在教育第一线的人民教师。以前我也自己写了个口诀,是“A绿B橙,中蓝尾褐,边白先中白后”现在看起来真实迂腐可陈。自己在大春老师的口诀上改了改,将双单、单双——双色在单位,单色在双位,即花线在前也总结进

    2025年12月14日
    4
  • 医学图形图像处理(医学影像和医学图像处理)

    文章目录1图像和数字图像1图像和数字图像  数字图像:被定义为一个二维函数,f(x,y),其中x,y代表空间坐标,f代表点(x,y)处的强度或灰度级。和普通的笛卡尔坐标系有区别,在计算机中坐标系左上角为原点:  图像数字化:图像进入计算机后,对图像进行数字化(映射)。数字图像三要素:  (1)像素:大小决定了图像存储、显示的清晰度;  (2)灰度值:通常为0-255,因为在计算机中通常用一个字节来表示一个像素,即28。  (3)坐标  图像存储在计算机中会丢失信息,因为是从一个连续的

    2022年4月15日
    57
  • imread怎么读取图片_opencv读不到图片

    imread怎么读取图片_opencv读不到图片Matimage_source=imread(“D:\program\xie.png”)直接放入图片的绝对路径只需要把图像文件放在工程文件夹下和.cpp文件放在一起就行了,读取的时候就可以直接用名字读取,如imread(“miao.jpg”);src=imread(argv[1],1);方法是:工程——属性——配置属性——调试——命令行参数,然后设置就行了。argv[1…

    2022年10月14日
    3
  • 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)

    怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(2)

    2021年11月29日
    41
  • 雅典娜暴利烹饪系列(上)

    雅典娜暴利烹饪系列(上)刨冰事件田中大人曾经问过:和平是无聊的的代名词吗?答:不是。今天的圣域在纱织的领导下,依然过着比战时更加热闹的日子。  早晨出门时,修罗觉得自己是这个世界上最为幸福的人。为了庆祝他拿到特级厨师证书,女神订购了最新的微波炉和冰箱装备到他的厨房里,吹着口哨出门采购的修罗,觉得今天的阳光格外的灿烂。  修罗出门,一般总是把厨房交给卡妙照顾,卡妙是全圣域厨艺仅次于修罗的人,尤其擅长制作冷饮,其成品清凉

    2022年8月30日
    5
  • 如何查看容器的IP地址和网络相关的参数?

    如何查看容器的IP地址和网络相关的参数?

    2021年9月4日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号