一、JSON格式数据
1、定义
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,已被广泛用于数据保存和交换,是迄今为止最为理想的数据交换语言。
JSON 独立于编程语言
层次结构简洁和清晰
易于人阅读和编写,也易于机器解析和生成
有效的提升网络传输效率
2、数据格式
JSON数据是一系列键值对的集合,它由JSON对象和JSON数组组成,且它们之间可以嵌套使用。
JSON对象
以"{"开始,以"}"结束;每个item都是一个无序键值对,表示为"key : value";键值对之间使用逗号(英文状态)分隔。
![](https://i-blog.csdnimg.cn/direct/4eb9d5818a2c4154ad196f97068e6838.png)
JSON数组
以"["开始,以"]"结束;每一个元素可以是String、Number、Char、Boolean、null、Object对象,甚至可以是嵌套JSON数组;数组元素间使用逗号(英文状态)分隔;Java语言对应操作类JSONArray。
![](https://i-blog.csdnimg.cn/direct/9939d26e72f448a2a9a16c81185474f1.png)
JS定义JSON数据
![](https://i-blog.csdnimg.cn/direct/d2745bdd3f6c4e058912d2940208122f.png)
![](https://i-blog.csdnimg.cn/direct/8a81a34f006d42af881a190117f83514.png)
![](https://i-blog.csdnimg.cn/direct/140ccad78b17463fad0309203d135b70.png)
![](https://i-blog.csdnimg.cn/direct/7f3a63af55b04e488698688962c7cba5.png)
3、实例操作
(1)项目中引入Jackson/fastjson的依赖,调用JSON转换方法将对象或集合转换成JSON数据,然后通过HttpServletResponse将JSON数据写入到输出流中完成回写,具体实现步骤如下。创建JSONController.java文件,在JSONController类中新增showJson()方法,用于将对象转换成JSON数据并完成回写。
![](https://i-blog.csdnimg.cn/direct/a90cad28dd4a41608ee65adc9b06ae5d.png)
(2)启动项目,浏览器中访问地址http://localhost:8080/api/showJson。访问后,页面显示效果如图所示。
![](https://i-blog.csdnimg.cn/direct/d2c633341fd3450a9df17d3277a739cb.png)
4、@ResponseBody注解
@ResponseBody是将处理器返回的对象通过适当的转换器转换为指定的格式(JSON 或XML格式),写入到HttpServletResponse对象的body区。使用此注解后不会再走视图处理器,而是直接将数据写入到输出流中。
@ResponseBody注解可以标注在方法和类上,标注在类上时,表示该类中所有方法均应用@ResponseBody注解。
如果@ResponseBody注解加在类上,也可以使用@RestController注解代替,该注解相当于@Controller+ @ResponseBody两个注解的结合。
返回值为String
![](https://i-blog.csdnimg.cn/direct/2aec938af9fa4f69975863295ff4ef8c.png)
返回值为JavaBean
![](https://i-blog.csdnimg.cn/direct/d5aff3911d2c4046b90a793d04d96794.png)
返回值为集合
![](https://i-blog.csdnimg.cn/direct/a41bb15c48024af5872a7e64db2ec21f.png)
如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为JSON字符串,然后写到客户端。
中文乱码
![](https://i-blog.csdnimg.cn/direct/6e8202c1c8344240b5d0074160f51b79.png)
![](https://i-blog.csdnimg.cn/direct/d9ca35dac11e494b92eb7ee34bfe36a2.png)
![](https://i-blog.csdnimg.cn/direct/5c84cf4a11244936b73da87cfdd4a86a.png)
二、Ajax异步请求
1、发送数据方式
地址参数(Url Param)
![](https://i-blog.csdnimg.cn/direct/d16a0814c19b40099afa1917c3522a66.png)
请求参数(Query Param)
![](https://i-blog.csdnimg.cn/direct/6fbe9d09746344e88da41997abc516c7.png)
表单提交(form-urlencoded)
![](https://i-blog.csdnimg.cn/direct/faddf71a62854629922c8f27e47f2bed.png)
![](https://i-blog.csdnimg.cn/direct/abb1d035a6ac40a095c0bdec91ab336c.png)
![](https://i-blog.csdnimg.cn/direct/aaf01790409c4772aa765f8823a8faec.png)
异步请求:json格式、二进制格式(form-data)、其他格式
2、定义
Ajax即Asynchronous JavaScript And XML(异步JavaScript和XML),用来描述一种使用现有技术集合的'新'方法,包括:HTML或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
AJAX 并非编程语言,AJAX 仅仅组合了: 1. 浏览器内建的 XMLHttpRequest 对象(从 Web 服务器请求数据) 2. JavaScript 和 HTML DOM(显示或使用数据)
Ajax 是一个令人误导的名称。Ajax 应用程序可能使用 XML 来传输数据,但将数据作为纯文本或 JSON 文本传输也同样常见。
Ajax 允许通过与场景后面的 Web 服务器交换数据来异步更新网页。这意味着可以更新网页的部分,而不需要重新加载整个页面。
3、工作原理
![](https://i-blog.csdnimg.cn/direct/b8506efd0731470ca4e9d29a2190327a.png)
![](https://i-blog.csdnimg.cn/direct/e07ff8cb813647d79d7e9b936e1a601e.png)
4、JS发送Ajax请求
语法
![](https://i-blog.csdnimg.cn/direct/34d172d74bee4ec5b663a3d89a0b5b18.png)
![](https://i-blog.csdnimg.cn/direct/c15739e5cf1541bb9565ad62934c7cca.png)
5、Jquery发送Ajax请求![](https://i-blog.csdnimg.cn/direct/d7c9681a99884de28b6c34e424f88a5d.png)
![](https://i-blog.csdnimg.cn/direct/dc8d31aedbb84334b7a122ac526df090.png)
![](https://i-blog.csdnimg.cn/direct/50523df8c37d414daa1c2663c1cd23b1.png)
6、实操
(1)使用Ajax无页面刷新方式,访问后端接口来添加商品数据。创建jsp页面,编写ajax请求。
![](https://i-blog.csdnimg.cn/direct/c1cd06398d934c3cab8e3ff5aa5bfdbd.png)
(2)创建controller,编写接口方法。
![](https://i-blog.csdnimg.cn/direct/405fea1c26ea41adaef15e3a555ad3f3.png)
(3)在浏览器中访问product_add.jsp页面,访问地址为http://localhost:8080/product_add.jsp。点击添加商品后,页面显示效果如图所示:
![](https://i-blog.csdnimg.cn/direct/fb9ebc4cb4f34ad5b91747ce75e43060.png)
三、服务端Session会话
在Web工程中,如果需要跨请求、跨页面共享数据,就需要将数据存储到session域中,即服务器内存中。SpringMVC通常有以下两种方式:
![](https://i-blog.csdnimg.cn/direct/161caebdc22146488ead284ab27390c1.png)
1、方式一:HttpSession
![](https://i-blog.csdnimg.cn/direct/486c6dfac2774da28c50498e58643d6b.png)
![](https://i-blog.csdnimg.cn/direct/bdae018d7d59405f9c1bcb6e1f3ecd12.png)
![](https://i-blog.csdnimg.cn/direct/3af88a65d369465ca3eee0461bc588a8.png)
2、方式二:@SessionAtt
![](https://i-blog.csdnimg.cn/direct/5fd5a8f8c1f841aea3d0889a9e0f76e7.png)
![](https://i-blog.csdnimg.cn/direct/1c36164057564c76965dcbd90c616852.png)
![](https://i-blog.csdnimg.cn/direct/1dd24e79a57a4b0796882a719bfd41ef.png)
3、清除Session
![](https://i-blog.csdnimg.cn/direct/f4c6b875a9a74d8cb94affff2436c17f.png)
4、案例:实现用户登录。
运行效果如下: 输入用户名:张哲、密码:123,登陆成功
![](https://i-blog.csdnimg.cn/direct/43f30bf7bc154de08c1f4daeb05fd89e.png)
![](https://i-blog.csdnimg.cn/direct/0baea63e10804e7e9a7c4b891f777261.png)
否则,登录失败
![](https://i-blog.csdnimg.cn/direct/f306b7bd37e545009205b11352524f59.png)
![](https://i-blog.csdnimg.cn/direct/c95910bed9cb4a12875d4107da9da8d3.png)
(1)创建工程,引入JSON相关依赖(Jackson/FastJson)。
<!-- fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.37</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.16.0</version>
</dependency>
<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
<!-- jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.16.0</version>
</dependency>
(2)在WebContent下新建"statics/js"文件夹,加入JQuery框架脚本"jquery-3.7.1.min.js"。
![](https://i-blog.csdnimg.cn/direct/640f4769be0f4d45bba16fcf1ca13423.png)
(3)创建login.jsp页面,通过该页面发送Ajax请求完成登录逻辑功能。 页面中引入JQuery框架脚本,并为"提交"按钮增加"onclick"事件,在事件中发送Ajax请求。
![](https://i-blog.csdnimg.cn/direct/97839ccd95954e09a0e73804bba0aedc.png)
(4)在Controller中,新增login()处理Ajax异步登录请求。当账号密码正确时,返回成功信息;否则返回失败信息。
![](https://i-blog.csdnimg.cn/direct/67707b3d122a499eab69e3e50b536403.png)
![](https://i-blog.csdnimg.cn/direct/30adc1a60059469eb828f75fa4d92571.png)
四、解决跨域问题
1、前后端分离
传统的单体架构是前后端不分离的架构。前端(用户界面)和后端(服务器端)代码都在同一个项目中,并且由同一套服务器技术生成。这种情况下,服务器端不仅负责处理业务逻辑,还要负责生成和返回前端的HTML页面。
![](https://i-blog.csdnimg.cn/direct/d0a1784e071d42aaa7be16471ae2ef4a.png)
![](https://i-blog.csdnimg.cn/direct/c18a0fc6996b41af93af761598c2f16e.png)
在前后端分离的架构中,前端和后端是相互独立的两个应用,分别单独部署。前端负责用户界面的展示和交互,后端负责处理业务逻辑和数据处理。前端通过AJAX等技术向后端的API接口发送HTTP请求,后端将处理请求并返回JSON或其他数据格式作为响应。
![](https://i-blog.csdnimg.cn/direct/d8b6739abd6d4c5eb62fdf42685b677e.png)
2、跨域问题
在前后端分离项目中,前端通过Ajax等技术向后端API接口发起请求时都会遇到跨域问题,跨域问题产生的原因是浏览器的同源策略。
![](https://i-blog.csdnimg.cn/direct/701eb7778b754cc096689adbd1cede75.png)
3、浏览器同源策略
浏览器的同源策略是一种重要的安全机制,用于防止一个网站的脚本与另一个网站的内容进行交互。 确保了敏感数据(如用户登录状态、个人信息等)的安全,防止了恶意脚本对数据的非法访问和操作。
![](https://i-blog.csdnimg.cn/direct/8c6c911281fc4df1bcc4fffb7f3643b7.png)
4、CORS解决方案
CORS是一个W3C标准,全称是跨域资源共享(Cross-Origin Resource Sharing)。CORS是通过在服务器端的响应中添加一个 Access-Control-Allow-Origin 标头,指定允许跨域的请求来源,通过这种方式允许指定源向服务器发出异步跨域 HTTP 请求,从而克服了同源使用的限制。
![](https://i-blog.csdnimg.cn/direct/b75f51826a7e4be990b75571e8c6bf81.png)
(1)方式一:@CrossOrigin注解
![](https://i-blog.csdnimg.cn/direct/7f9fc3c53a9a4a4985eb90ff7d9017ab.png)
![](https://i-blog.csdnimg.cn/direct/4c8b7549c4524eff988ae7686825e554.png)
(2)方式二:全局配置
![](https://i-blog.csdnimg.cn/direct/27dfe0e2299b401e826ffbe16fa68aac.png)
![](https://i-blog.csdnimg.cn/direct/ed4371a3d9c54486b4b55a8c1f10337e.png)