ajax跨域问题以及解决方案_js跨域请求的三种方法

ajax跨域问题以及解决方案_js跨域请求的三种方法出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)AJAX跨域请求下面简单模拟一个场景—–>>前端有.

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

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

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
在这里插入图片描述

AJAX跨域请求

下面简单模拟一个场景—–>>
前端有一个页面

在这里插入图片描述

鼠标离开用户名输入框时,检查是否符合要求,如果为空,则给提示,如果不为空,则异步查询数据库,后返回结果;

本次请求的页面是8082端口的,而响应的ajax路径却是8080端口的

前端代码—>

<!DOCTYPE html>
<html>
	
<head>
    <title>$Title%sSourceCod</title>
    <meta charset="UTF-8"/>
    <script src="js/jquery-3.5.1.min.js"></script>
    <script> function checkUname(){ 
     // 获取输入框中的内容 if(null == $("#unameI").val() || '' == $("#unameI").val()){ 
     $("#unameInfo").text("用户名不能为空"); return; } $("#unameInfo").text(""); // 通过jQuery.ajax() 发送异步请求 $.ajax( { 
     type:"GET",// 请求的方式 GET POST url:"http://localhost:8080/loadPicture_war_exploded/checkName.do?", // 请求的后台服务的路径 data:"uname="+$("#unameI").val(),// 提交的参数 success:function(info){ 
     // 响应成功执行的函数 $("#unameInfo").text(info) } } ) } </script>
</head>
<body>
<form action="myServlet1.do" >
    用户名:<input id="unameI" type="text" name="uname" onblur="checkUname()">
    <span id="unameInfo" style="color: red"></span><br/>
    密码:<input type="password" name="pwd"><br/>
    <input type="submit" value="提交按钮">
</form>
</body>
</html>

后端代码—>

package com.gavin.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/checkName.do")
public class testAjax extends HttpServlet { 
   
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
   
        String uname = req.getParameter("uname");
        String callBack = req.getParameter("aaa");
        System.out.println(uname);
        String info = "";
        if ("gavin".equals(uname)) { 
   
            info = "用户名已经占用";
        } else { 
   
            info = "用户名可用";
        }
        // 向浏览器响应数据
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/javaScript;charset=UTF-8");
        resp.getWriter().print(callBack + "('" + info + "')");
    }
}

访问的时候浏览器提示—>
在这里插入图片描述
原因—>

对 CORS 请求的响应缺少必需的Access-Control-Allow-Origin头,其用于确定在当前源内操作的资源是否可以访问。

如果服务器在您的控制之下,请将请求站点的源添加到允许访问的域集,方法是将其添加到Access-Control-Allow-Origin头的值。

在这里插入图片描述
为什么会有跨域呢?
因为实际应用中分布式与集群会涉及到跨域,前端服务器与后端服务器分离,前端服务异步请求后端服务器就涉及到了跨域;

由于浏览器的同源策略,所以跨服务器访问会有一些小麻烦,先一步一步探索去解决;
在这里插入图片描述
这个时候js文件能不能加载生效呢? 答案是生效了;
在这里插入图片描述
Web页面上调用js文件时可以跨域,也就是后拥有”src”这个属性的标签都却拥有跨域的能力

那么我们转变思路,如果将异步请求转到js文件身上
比如我们可以这么做
在这里插入图片描述
后端可以接收到前端数据;
但是这样写看起来怪怪的,而且实际上这样异步请求中的url依然会被浏览器拦截
在这里插入图片描述
如果去掉这个url,会发生不可描述的事情,像这样—-整个span被页面代码填满,
在这里插入图片描述
那怎么处理呢?

此时异步请求添加一个属性—dataType:“jsonp”
这样就可以正常一点实现跨域的异步请求了—>

        function checkUname(){
            // 获取输入框中的内容
            if(null == $("#unameI").val() || '' == $("#unameI").val()){
                $("#unameInfo").text("用户名不能为空");
                return;
            }
            $("#unameInfo").text("");
            // 通过jQuery.ajax() 发送异步请求
            $.ajax(
                    {
                        type:"GET",// 请求的方式 GET  POST
                        url:"http://localhost:8080/loadPicture_war_exploded/checkName.do?", // 请求的后台服务的路径
                        data:"uname="+$("#unameI").val(),// 提交的参数
                        dataType:"jsonp",
                        success:function(info){ // 响应成功执行的函数
                            $("#unameInfo").text(info)
                        }
                    }
            )
        }

在这里插入图片描述

在这里插入图片描述

原因—->>
在这里插入图片描述

虽然跨域请求实现了,但是前端接收不到后端返回的数据,即异步 请求中的success方法失效了,
为什么失效?因为如果是通过script来完成异步请求,那么返回的内容应该是一个js代码,
在这里插入图片描述
在这里插入图片描述

既然是这样,我们要想在span中添加返回类的信息,那么我们不妨在前端写一个方法,用于专门像span中添加信息—然后后端返回的信息来直接调这个方法就好了;

			function showInfo(info){
				$("#unameInfo").val(info);
			}

后端返回的数据
在这里插入图片描述
在这里插入图片描述
运行原理——>>>>
在这里插入图片描述
解决一个小痛点,前端方法名随时可能变化,为了降低耦合度,一般会这么做,前端发送的数据中携带该方法名;

在这里插入图片描述

在这里插入图片描述
前面不是说success废了吗?我就想用这个方法,不想在额外定义一个别的showInfo方法,那么这个该怎么做呢?
在异步请求上添加一个参数:
jsonp:“任意的名称A”

在这里插入图片描述
在这里插入图片描述

GetJson实现跨域请求

	        function checkUname(){
            // 获取输入框中的内容
            if(null == $("#unameI").val() || '' == $("#unameI").val()){
                $("#unameInfo").text("用户名不能为空");
                return;
            }
            $("#unameInfo").text("");
         
           $.getJSON(
           	"http://localhost:8080/loadPicture_war_exploded/checkName.do?jsoncallback=?",
           	{uname:$("#unameI").val()},
           	function(info){
           		$("#unameInfo").text(info)
           	}
           	
           )
        }
        
        

在这里插入图片描述

通过后台代码也可以实现跨域,一般在过滤器中添加如下代码,那么前端在请求时就不用考虑跨域问题了

/*请求地址白名单 *代表所有 /
resp.setHeader(“Access-Control-Allow-Origin”, “
“);
/*请求方式白名单 */
resp.setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”);
resp.setHeader(“Access-Control-Max-Age”, “3600”);
resp.setHeader(“Access-Control-Allow-Headers”, “x-requested-with”);

在结合springmvc之后,可以通过一个注解来完成跨域

CrossOrigin注解实现跨域

在这里插入图片描述在这里插入图片描述

package com.gavin.controller;

import com.gavin.pojo.AlertMsg;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
public class AjaxTEST  { 
   


    @CrossOrigin(value ="http://127.0.0.1:8020" )
  @RequestMapping("/checkName3.do")
    @ResponseBody
    public AlertMsg checkUserName(@RequestBody AlertMsg alertMsg)  { 
   
        System.out.println(alertMsg);
        if ("gavin".equals(alertMsg.getUname())) { 
   
            alertMsg.setMsg("用户名已经占用");
        } else { 
   
            alertMsg.setMsg( "用户名可用");
        }
        // 向浏览器响应数据----返回一个json格式的数据
        System.out.println(alertMsg);
        return alertMsg;

    }
}
			function checkUname3() {
				// 获取输入框中的内容
				if(null == $("#unameI3").val() || '' == $("#unameI3").val()) {
					$("#unameInfo3").text("用户名不能为空");
					return;
				}
				$("#unameInfo3").text("");
				var str = $("#unameI3").val();

				$.ajax({
					type: "post",
					url: "http://localhost:8080/loadPicture_war_exploded/checkName3.do?",
					//					data:{uname:$("#unameI3").val(),msg:""},
					//data:{"uname":$("#unameI3").val(),"msg":""},
					data: JSON.stringify({
						uname: $("#unameI3").val()

					}),
					dataType: "json",
					contentType: "application/json;charset=UTF-8",
					success: function(data) {

						$("#unameInfo3").text(data.msg);
					}
				});
			}

在这里插入图片描述
在这里插入图片描述

关于json对象的一些感悟与理解;
前端传过来的数据—-可能是字符串,也可能是json对象,但是在处理的时候还是以字符串进行处理的,
JSON.stringify()方法是将一个JavaScript对象转换成符合JSON格式的字符串,然后后端通过解析字符串在转化为一个json对象;
所以在这里插入图片描述
ajax跨域的解决方案有种了,
第一种是 jsonp的形式,
另一种是getjson()
最后一种是注解CrossOrigin

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172564.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python生成矩阵 元素随机_用python生成随机矩阵「建议收藏」

    python生成矩阵 元素随机_用python生成随机矩阵「建议收藏」在下面的代码中,我对一般的平方线性系统Ax=b实现了带有部分旋转的高斯消去。我测试了我的代码,它产生了正确的输出。不过,现在我正在尝试做以下事情,但我不太确定如何编码它,寻找一些帮助与此!我想通过求解Ax=b来测试我的实现,其中A是随机的100×100矩阵,b是随机的100×10向量。在我的代码中,我把矩阵A=np.array([[3.,2.,-4.],[2.,3.,3.],[5.,-3.,1…

    2022年10月27日
  • EVE模拟器使用说明

    EVE模拟器使用说明本着分享和共同学习的态度,希望能给有需要的人带来帮助。 转载于:https://blog.51cto.com/dashu666/1971728

  • 狂神说SpringMVC05:整合SSM框架

    狂神说SpringMVC05:整合SSM框架狂神说SpringMVC系列连载课程,通俗易懂,基于Spring5版本(视频同步),欢迎各位狂粉转发关注学习。未经作者授权,禁止转载整合SSM框架在上一节中,我们了解了SpringMVC…

  • 解决 无法解析名称 NaiveBayes.fit。/i get Undefined variable “NaiveBayes“ or class “NaiveBayes.fit“.

    解决 无法解析名称 NaiveBayes.fit。/i get Undefined variable “NaiveBayes“ or class “NaiveBayes.fit“.应用朴素贝叶斯分类器时候,发现报错无法解析名称NaiveBayes.fit这是因为你想用NaiveBayes。适用于MATLABR2018b。根据NaiveBayes的R2014b发布说明,fit被fitNaiveBayes取代:同时根据R2018a发布说明fitNaiveBayes被fitcnb取代。因此,使用fitcnb即可。将NaiveBayes.fit改为fitcnb就好啦!!!参考链接:链接:点击这里.打个小广告啊啊啊打个小广告,欢迎关注我的公众号“麦香E站”,分

  • 【虚拟DOM】浅析 虚拟DOM「建议收藏」

    【虚拟DOM】浅析 虚拟DOM「建议收藏」虚拟DOM作为目前流行的DOM操作思想,被广泛用在react中,这套设计的确在用户体验上带来了显著提升。下面我们来浅析一下这个东西,一步步看下去,希望你能有所收获。设计理念尽管MVVM将页面逻辑实现的核心转移到数据层面的修改上,但是最终数据层反映到页面上View的层的渲染和改变仍是通过对应的指令进行DOM操作来完成的。而且,通常一次ViewModel的变化可能会触发液面上多个指令操……

    2022年10月27日
  • 【linux命令】 tree命令

    【linux命令】 tree命令文章目录Tree命令安装方法一,yum安装方法二,源码安装Tree命令安装方法一,yum安装命令:yuminstalltree方法二,源码安装1.下载安装包,地址:http://mama.indstate.edu/users/ice/tree/2.解压安装1)Linux环境(CentOS6.5)下安装a.解压tree-1.7.0.tgz文件,命令:tar-zxvftree-1.7.0.tgzb.进入解压目录中,命令:cdtree-1.7.0      c.安装文件,命令:

发表回复

您的电子邮箱地址不会被公开。

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