异步请求(Ajax,axios,json)

news2024/12/25 13:43:14

同步/异步请求

表单(前端)向后端发送请求,属于同步请求

同步: 发一个请求, 给一个回应, 会用回应的内容覆盖掉浏览器中内容,这样会打断前端其他的正常操作,在现在的前端中,显得不太友好。

异步: 不同步 前端正常输入时,可以同时与后端进行交互,后端响应的数据不会影响前端正常操作.

可以使用一个js中提供的对象,向后端发送请求, 服务器响应的内容会被js对象接收。然后在js中,用接收到的内容局部的更新网页,这样整个过程页面不会出现刷新,覆盖操作,不会打断页面的正常操作。现在的前后端交互技术,基本都是基于Ajax的异步交互技术

现在的前后端交互技术,基本都是基于Ajax的异步交互技术

Ajax 阿贾克斯 异步交互技术

Ajax 全称为:“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),使用 Ajax,可以无刷新状态更新页面,并且实现异步提交,提升了用户体验。

Ajax其实质是利用浏览器提供的一个特殊的对象(XMLHttpRequest)异步地向服务器发送请求,服务器返回部分数据,浏览器让你去利用这些数据对页面做部分的更新,整个过程,页面无刷新,不打断用户的操作。

创建XMLHttpRequest对象

XMLHttpRequest对象:发送请求到服务器并获得返回结果

浏览器都建了XMLHttpRequest 对象,通过一行简单的JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。 new XMLHttpRequest();

JavaScript对象XMLHttpRequest是整个Ajax技术的核心,它提供了异步发送请求的能力

常用方法:

常用属性

  • onreadystatechange:事件,指定回调函数

  • readystate: XMLHttpRequest的状态信息

  • responseText:获得响应的文本内容

Get方式提交:

  • xmlhttp.open("GET" , "testServlet?name= "+userName,true);

  • xmlhttp.send();

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            function checkAccount(account){
                var httpobj=new XMLHttpRequest();
                httpobj.open("get","http://127.0.0.1:8080/webBack/reg?account="+account,true);
                httpobj.send();
                httpobj.onreadystatechange=function(){
                    //接收后端的响应数据
                    document.getElementById("aid").innerHTML=httpobj.responseText;//存在一个问题,浏览器默认不让前端8848接收来自其他服务器的响应数据
                }
            }
        </script>
    </head>
    <body>
        <form action="http://127.0.0.1:8080/webBack/reg" method="post">
            账号:<input type="text" name="account" value="" onblur="checkAccount(this.value)"/>
            <span id="aid"></span><br />
            密码:<input type="text" name="password" value=""/><br/>
        </form>
    </body>
</html>
package servlet;
public class RegServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String account=req.getParameter("account");
        resp.setHeader("Content-Type","text/html;charset=utf-8");//设置啊应义
        if(account.equals("admin")){
            resp.getWriter().print("账号已经被注册");
        }else{
            resp.getWriter().print("账号可以注册");
        }
    }
}

但是存在一个问题,浏览器默认不让前端8848接收来自其他服务器的响应数据。

跨域

但是前后端交互中出现一个跨域问题:属于前端问题

跨域是指从一个域名的网页去请求另一个域名的资源。只要协议、域名,端口有任何一个的不同,就被当作是跨域

在前端服务页面中(8848) 接收后端服务器响应的数据(8080),使用ajax技术前端后交互,为了安全性,前端默认会进行阻止,不让前端服务接收其他后端的数据。

跨域问题解决:

  • 前端解决

  • 后端解决:跨域资源共享(Cross-origin Resource Sharing),简称CORS

这个机制就是实现了跨站访问控制,使得安全地进行跨站数据传输成为可能。服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许ajax进行跨域的访问。只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入设置,就可以实现跨域访问了!在响应头中设置说明,告知浏览器,此次的响应是可靠的。

创建过滤器实现后端设置允许跨域访问:

package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CorsFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        //允许携带Cookie时不能设置为* 否则前端报错
        httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie

        filterChain.doFilter(servletRequest, servletResponse);
    }
}
<!--配置允许跨域响应-->
<filter>
    <filter-name>corsFilter</filter-name>
    <filter-class>filter.CorsFilter</filter-class>
</filter>

<!--配置进入到过滤器的映射地址-->
<filter-mapping>
    <filter-name>corsFilter</filter-name>
    <url-pattern>/*</url-pattern><!--配置哪些地址可以进入到当前的过滤器中-->
</filter-mapping>

axios框架

  • 下载axios文件https://unpkg.com/axios/dist/axios.min.js

  • 将axios.min.js放在js目录底下

用axios,后端也要处理跨域问题

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        
        <script src="js/axios.min.js" type="text/javascript"></script>
        <script>
            function checkAccount(account){
                axios.get("http://127.0.0.1:8080/webBack/reg?account="+account).then(function(resp){//then就相当于回调,请求成功之后就响应,resp是后端响应的数据
                    document.getElementById("aid").innerHTML=resp.data;//get请求。
                })
                
                /* axios.post("http://127.0.0.1:8080/webBack/reg","account="+account+"&age=20").then(function(resp){
                    document.getElementById("aid").innerHTML=resp.data;
                    //post请求数据是在请求体中,数据和地址是分开的。resp.data是后端响应的数据
                }) */
            }
        </script>
    </head>
    <body>
        <form action="http://127.0.0.1:8080/webBack/reg" method="post">
            账号:<input type="text" name="account" value="" onblur="checkAccount(this.value)"/>
            <span id="aid"></span><br />
            密码:<input type="text" name="age" value=""/><br/>
        </form>
    </body>
</html>

JSON

后端如何向前端响应更多的数据,可以把数据封装在一个个对象中,然后把对象直接响应给前端

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

  • 数据在键值对中

  • 数据由逗号分隔

  • 大括号保存对象

  • 方括号保存数组

语法:

JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 " " 包裹,使用冒号 : 分隔,然后紧接着值:

  • {"firstName": "John"}

  • {"name":"value","sex":"男"}

将以下6个jar包导入lib底下:

  • jackson-annotations-2.13.2.jar

  • jackson-core-2.13.2.jar

  • jackson-databind-2.13.2.2.jar

  • jackson-datatype-jdk8-2.13.2.jar

  • jackson-datatype-jsr310-2.13.2.jar

  • jackson-module-parameter-names-2.13.2.jar

public class RegServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        resp.setHeader("Content-Type","text/html;charset=utf-8");
        String num=req.getParameter("num");
        Student student=new Student(num,"张三","男","13677778888");
        //resp.getWriter().print(student);//向前端响应的是对象的hashcode值
        //涉及到了两种不同语言(java,js)之间进行数据交互 以前java把数据写入到一个xml 文件中,把xml文件传给前端,前端解析此做法非常复杂.
        //现在交互中,产生一种轻量级的数据格式(name:"jim",age:20]
        // student对象 --->num:109,name:"jim",age:20]
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(student);//转为JSON键值对形式的字符串
        System.out.println(s);
        resp.getWriter().print(s);//响应给前端
    }
}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/axios.min.js" type="text/javascript"></script>
        <script>
            function checkAccount(num){
                axios.post("http://127.0.0.1:8080/webBack/reg","num="+num).then(function(resp){
                    //resp.data->Student对象,前端接收到JSON字符串后,自动会转化为js对象
                    console.log(resp.data);
                    console.log(resp.data.num);
                    console.log(resp.data.name);
                    console.log(resp.data.gender);
                    console.log(resp.data.phone);
                })
            }
        </script>
    </head>
    <body>
        <form action="" method="post">
            学号:<input type="text" name="num" value="" onblur="checkAccount(this.value)"/><br/>
            <span id="aid"></span><br />
        </form>
    </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云部署vitepress,高颜值文档博客

首先上官方网站。https://vitepress.dev/ 先看两张效果图。 一定要用这个官网&#xff0c;之前看了一个翻译版本&#xff0c;好像翻了一半不弄了&#xff0c;坑了半天时间也解决不了。目前看起来还没有官翻。 目前使用到的是腾讯云的轻量应用服务器&#xff0c;效果还是非常好…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(数据的表现形式及其运算)

目录 &#x1f34a;1.数据的表现形式及其运算 &#x1f349;1.1常量和变量 &#x1f340;1.1.1常量 &#x1f340;1.1.2变量 &#x1f340;1.1.3常变量 &#x1f340;1.1.4标识符 &#x1f349;1.2数据类型 &#x1f349;1.3整型数据 &#x1f340;1.3.1整型数据的分类…

FCPX插件Stupid Raisins Split Pop 2(视频照片动画拆分效果插件)

Stupid RAIsins Split Pop是一个视频照片动画拆分效果插件&#xff0c;它允许您在Final Cut Pro&#xff0c;Motion&#xff0c;Premiere Pro和After Effects中使用。fcpx插件Split Screen非常适合用视频和照片创建动画分割&#xff0c;专为4K UHD和高清视频而设计&#xff0c;…

RAID5重建失败的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器&#xff0c;4块SAS磁盘组建了一组RAID5磁盘阵列。服务器安装的windows server操作系统&#xff0c;上面运行了一个Oracle单节点&#xff0c;数据存储为文件系统&#xff0c;无归档。该oracle数据库的数据量不大&#xff0c…

Python爬虫——批量下载微信公众号图片

目标&#xff1a; 微信公众号是现代社交媒体中最受欢迎的平台之一&#xff0c;每天都有数以百万计的人在浏览不同的公众号&#xff0c;其中大部分都包含了图片内容。如果你是一位公众号的管理员或者粉丝&#xff0c;你可能想要在本地保存一些感兴趣的图片。但是&#xff0c;微…

GIT下载安装

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

函数中的 static int 变量

#include <iostream>using namespace std;void function( ) {static int a 3 ; // 不赋值的话是 a 等于0&#xff1b;cout<<"a"<<a<<endl;aa3;cout<<"a"<<a<<endl;}int main(int argc, char** argv) {cout&l…

Apache DolphinScheduler 荣获“掘进技术引力榜”「2023 年度 ROBUST 开源项目」奖项!

经过紧张激烈的投票和严格的专家评审环节&#xff0c;“掘进技术引力榜”活动在上周的稀土掘金开发者大会上公布了「2023 年度 ROBUST 开源项目」奖项的获奖名单&#xff0c;Apache DolphinScheduler 名列其中。 Apache DolphinScheduler 代表上台领奖&#xff08;右三&#x…

蓝桥杯专题-真题版含答案-【蚂蚁感冒】【地宫取宝】【波动数列】【李白打酒】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Java开发的打包和分发机制之jar包

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于jar包的相关操作吧 一.什么是jar包 "jar包"是Java Archive的缩写&#xff0c;它是一种用于打包Java类、资源文件、库等内容的文件格式Jar包是一种特…

flutter聊天界面-聊天气泡长按弹出复制、删除按钮菜单

flutter聊天界面-聊天气泡长按弹出复制、删除按钮菜单 在之前实现了flutter聊天界面的富文本展示内容&#xff0c;这里记录一下当长按聊天气泡的时候弹出复制、删除等菜单功能 一、查看效果 当长按聊天气泡的时候弹出复制、删除等菜单&#xff0c;可新增更多按钮 二、代码实现…

【网络安全带你练爬虫-100练】第8练:json数据的最小项提取

目录 一、目标1&#xff1a;爬取指定json中数据 二、目标2&#xff1a;循环取json中数据 三、目标3&#xff1a;提取每个数据中的某一项 四、网络安全小圈子 一、目标1&#xff1a;爬取指定json中数据 爬取data里数据 核心代码&#xff1a; dirt1 json.loads(res.text)pr…

奉劝各位项目经理,最好别参加8月PMP考试了……

早上好&#xff0c;我是老原。 上周我看到一篇介绍考证的文章&#xff0c;结果在热评看到了PMP证书。 不得不承认&#xff0c;PMP证书现在的火热程度已经超过了我们的想象。前几年我选择考PMP&#xff0c;也只是为了在求职的时候多个优势。 但是现在&#xff0c;几乎我周围所…

ThreadLocal使用场景介绍以及关于内存泄漏的探讨

目录 1. 使用场景一&#xff1a;线程隔离 2. 使用场景二&#xff1a;使用ThreadLocal进行跨函数数据传递 3. ThreadLocal导致的内存泄漏问题 4. ThreadLocal在Spring框架中的应用 5. 扩展&#xff1a;InheritableThreadLocal 转载&#xff1a;【Java】ThreadLocal使用场景…

字节、数据位、ascii码、RS232串口、modbus协议

RS232通信协议详解 - 百度文库 ASCII_百度百科 ascii码表 modebus协议 - 百度文库https://wenku.baidu.com/view/58aae6134431b90d6c85c7b6.html?_wkts_1688713246949&bdQueryascii%E7%A0%81modelbus%E7%A0%81 Modbus 的RTU、ASCII、TCP傻傻搞不清楚&#xff1f;一文全…

归并排序的应用—逆序对的个数

一、&#xff08;题目&#xff09; 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输…

吐血整合!风控与反欺诈相关数据来源(上)

本文会分上、下两篇&#xff0c;介绍各种风控与反欺诈相关的数据来源&#xff0c;包括其主要的数据维度和产品服务形态。 目录&#xff1a; 人行二代征信 持牌征信机构数据 司法大数据 航旅大数据 铁路大数据 税务大数据 交通大数据 电力大数据 保险大数据 人社大数据 一、人行…

vs2019打包发布c#编写的exe应用

由于该应用还要引用其它的exe应用&#xff0c;所以 .NET Framework 4.6.2 脱机安装程序Windows - Microsoft 支持 参考下面的配置即可 VS2019如何打包程序_vs2019 打包_咻咻咻...的博客-CSDN博客https://blog.csdn.net/qq_37043193/article/details/119530253?ops_request_…

JVM源码剖析之Java对象创建过程

关于 "Java的对象创建" 这个话题分布在各种论坛、各种帖子&#xff0c;文章的水平参差不齐。并且大部分仅仅是总结 "面试宝典" 的流程&#xff0c;小部分就是copy其他帖子&#xff0c;极少能看到拿源码作为论证。所以特意写下这篇文章。 版本信息如下&…

搭建帮助中心5大注意事项

在现代互联网时代&#xff0c;为企业网站建立一个优雅实用的网站帮助中心变得尤为重要。一个好的网站帮助中心可以帮助企业解决客户的难点、痛点&#xff0c;提高客户满意度、期待值&#xff0c;从而更好地留住客户&#xff0c;增加收入。 如果没有帮助中心或者是帮助中心创建…