SpringMVC(2)
一)接受到JSON格式的数据:使用@RequestBody来进行接收
@ResponseBody表示的是返回一个非页面的数据
@RequestBody表示的是后端要接受JSON格式的数据
一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收
1)我们之前接受GET请求中的queryString中的参数的时候,我们是使用在参数中创建一个对象来进行接收的,但是如果我们要接受一个JSON格式的对象,我们需要在对象前面加上@RequestBody注解,标识为要接受JSON格式的数据;
2)加上@RequestBody后表示要读取一个JSON数据,加到对象前面就行了;
3)我们前后端的一个交互过程相当于是:我们先通过一个URL来进行访问html界面,当html界面进行加载的时候,就会给服务器发送一个二次请求,发送一个格式为json格式数据的post请求,然后服务器会进行返回一个json格式的数据;
4)虽然我们现在已经把JSON格式的字符串发送给后端了,但是如果我们使用对象来进行接受的时候不加上@RequestBody注解,那么最后的对象什么也不会接受到,都是默认值;
2)前端传来的是一个Json对象时:@HashMap,键值对的方式来进行接收
用POSTMMAN接受JSON格式的数据,点击body,点击raw,点击Text,再点击JSON,就可以构建JSON格式的字符串发送;
3)当前端传来这样一个Json数组:用List<实体类>,@RequestBody
下面我们来进行演示一下:前端传递一大堆JSON对象,后端如何进行接受一个JSON数组
@Controller @ResponseBody @RequestMapping("/Java100") public class UserController {@RequestMapping("/hello")public List<User> start(@RequestBody List<User> list){return list;} }
二)接收表单提交的数据以及获取特殊url的参数:
1)获取表单提交格式:
2)获取到特殊URL地址中的参数:@PathVariable是从地址部分获取参数而不是从URL地址中的参数部分来进行获取参数
我们先创建一个User类: @ToString @Setter @Getter public class User {public String username;public String password;public int ClassID;public int UserID; } 我们进行访问的地址:http://127.0.0.1:8080/host/李佳伟/12503487 @RequestMapping("/host/{username}/{password}")@ResponseBodypublic Object Start(@PathVariable String username,@PathVariable String password){User user=new User();user.setUsername(username);user.setPassword(password);return user;//返回的是一个JSON格式的数据}
三)上传文件
3.1)上传文件:我们想把文件传递给电脑上面,用的方法是transferTo,里面一共有两个参数,一个是File,一个是Path
3.2)@MultipartFile是专门用来接收文件的一个注解,在@RequestPart注解里面,这个Key值可以任意设置,里面填写的相当于是input标签里面的name属性,transferTo方法的主要作用是把当前文件的二进制流,放到一个目录底下
@RequestMapping("/file") @ResponseBodypublic String upload(@RequestPart("myfile")MultipartFile file) throws IOException { //保存文件file.transferTo(new File(""d:/loggs/test.jpg""));//里面要创建一个新的文件对象return "上传成功";}
当我们想要上传头像的时候通常要加两个参数,一个是上传图片文件,另一个是这个图片是谁传递过来的,相当于是图片的唯一身份标识,不要去传递name属性,因为name属性有可能重复
1)我们直接可以进行点击Body中的form-data,Key值选择myfile,右键选择file就可以进行上传文件了
2)我们过来的文件一个是给开发环境用的,一个是给生产环境用的
3)我们这里面的@RequestMapping里面的参数表示路由地址,表示的是url中的地址,但是@RequestPart里面的参数表示的是form-data中的Key值
4)假设你想要修改头像,你要修改哪一个人的头像,你要注意此时不可以传名字属性,你要传入唯一的属性叫做ID,我们要根据ID来进行查找到数据库中的唯一的语句,然后进行头像修改
5)这里面要存放路径+文件名称
1)但是从目前的情况来看,当前写的上传图片的代码是有问题的;
2)上传图片的路径是写死的,图片内容是写死的,况且后上传的图片会把前面的人上传的图片给覆盖掉;
3)这里面传输图片的时候,key相当于是form表单中的name属性,idea天生支持yml的配置文件里面
那么我们如何来解决这个问题呢?主要就是从两个角度来出发:
1)文件目录怎么办?
在程序里面写死,本地上运行是没有问题的,但是最终项目我们要是在linux服务器上面是有问题的,linux没有C盘D盘,就是我可以针对不同的环境写不同的配置文件,上线的时候只需要改一个参数即可
2)图片名称,每一个人的图片名称不能重复
3)获取原上传图片的格式,不能写死.png,万一是一个gnf,导致图片上传而导致文件格式发生变化
1)目录:设置到配置文件里面,一个设置开发环境的路径,有C盘D盘,一个是线上环境的路径,设置为linux的路径,这样就可以在不同的环境写不同的配置文件,上线的时候只需要改参数就可以了,甚至说有的公司还有开发平台,生产平台,测试平台,每一个平台都对应着一个不同的路径;
假设你要将100个图片放在100个不同的路径底下,我们只需要进行修改配置文件里面就可以了,这样就就可以保证我们每进行修改一次配置文件,就换了一个不同的存放目录,还要有主配置文件
2)图片名称,一种是使用时间戳,一种是使用UUID,一种是用用户的唯一身份标识自增主键
3)获取到原图片上传的格式:先获取到文件的具体名字,在进行字符串截取文件格式是文件名的一部分
因为在不同环境下面我们可以设置不同打印日志信息,在开发环境我们可以日志级别是设置trace,因为在开发环境争取看到更多的配置信息,在生产环境我们就可以设置日志级别是warn,这样就可以使在生产环境下看到主要的报错信息
application.properties里面的代码设置配置文件的活跃性:spring.profiles.active=dev1
//开发环境就设置配置文件是dev1(windoes上面的路径),如果是生产环境就设置配置文件是dev2(linux环境上面的路径)
@Controller
public class UserController {@Value("${FilePath.url}")//读取配置文件里面的urlprivate String url;@PostConstructpublic void start(){System.out.print(url);}@RequestMapping("/file")@ResponseBodypublic String Upload(@RequestPart("myfile") MultipartFile file) throws IOException {
//1上传文件路径,从配置文件中读取,小心文件名重复而造成覆盖String BasePath=url;
//2生成动态的文件名,没传过来一个文件都要生成动态的文件名:xx.jpg
String filename= UUID.randomUUID()+(file.getOriginalFilename()
.substring(file.getOriginalFilename()
.lastIndexOf(".")));System.out.println(filename);file.transferTo(new File(BasePath+filename));return "上传成功";}
}
1)我们在创建不同平台的yml配置文件;
2)在主配置文件中设置运行的配置文件;
application-dev.yml
spring:profiles:active: dev1
application-dev1.yml里面的代码:
#表示生产环境的配置文件,里面进行存放的是本地Windows系统上面的图片保存路径(父亲路径) img:ImageFatherPath: D:/Data/ #表示要存放图片的父亲目录
application-dev2.yml里面的代码:
#表示开发环境的配置文件,最终保存在linux服务器上面,我们在这里面是要进行指定图片的保存路径的(因为他们没有C盘D盘) img:ImageFatherPath: /root/img
//因为我们返回的是字符串,所以我们不光要添加对应的路由映射 还要添加返回的格式是一个字符串而不是一个页面 @Controller public class UserController {//从配置文件中读取我们上传的image图片保存的图片父亲路径@Value("${img.ImageFatherPath}")private String fatherPath;@RequestMapping("/Java100")@ResponseBodypublic String run(@RequestPart("myfile")MultipartFile file) throws IOException {//1.获取到原来要进行保存的文件的父亲路径:fatherPath//2.获取到文件的名称//3.获取到原文件上传的格式UUID是全球唯一IDString filename=file.getOriginalFilename();//xxx.png------得到原图片的名称filename=filename.substring(filename.lastIndexOf(".")); //subString表示表示从指定位置开始截取到最后一个位置 Substring(参数1,参数2); 截取字串的一部分,参数1为左起始位数,参数2为截取几位 //png---得到原图片的后缀filename=UUID.randomUUID().toString()+filename;file.transferTo(new File(fatherPath+filename));return "上传成功";} }
4)获取到Cookie和Session和Header头
1)这些都是系统自己产生的,不是用户进行自定义的;
2)每一个方法都默认支持了两个隐藏参数,所有的SpringMVC里面,所有映射方法中,都会内置两个参数,HttpServletRequest和HttpServletResponse这两个参数;
3)通过上面的方式就可以进行设置Cookie了
4.1)通过原生Servlet的方式来获取到Cookie
4.2)我们也是可以通过@CookieValue(名字),名字就是Key值实现了读取特定名称的Cookie
@Controller public class User1Controller {@RequestMapping("/hello")@ResponseBodypublic String run(@CookieValue("username") String username,@CookieValue("password") String password){ //上面的这种@CookieValue的方式是根据Cookie种的Key来进行获取到valuereturn username+password;} }
通过上述在浏览器控制台上面我们也是可以进行添加Cookie的,随便加的;
4.3)使用这种SpringMVC的专用方法也是可以获取到Cookie字段的,通过@RequestHeader("Cookie")的方式来一次性读取到所有的Cookie
@Controller class UserController{@RequestMapping("/Java")@ResponseBodypublic String GetHeader(@RequestHeader("Cookie") String Cookie){return Cookie;} }
@Slf4j//这个注解是一个类注解,而不是一个方法注解 @Controller public class User1Controller {@RequestMapping("/hello")@ResponseBodypublic void run(@RequestHeader("Cookie")String cookies){ //这个注解必须用一个字符串来进行接收,况且@RequestHeader里面填写要获取到哪一个字段String[] strings=cookies.split(" ");for(String s:strings){System.out.println(s);}} } //从上面结果也是可以看出,也是可以按照空格来进行分割的 username=abc; password=cde
获取Header头:
@Controller class UserController{@RequestMapping("/Java")@ResponseBodypublic String GetHeader(@RequestHeader("Host") String userAgent){return userAgent;} }
@Controller
public class UserController {@RequestMapping("/Java100")@ResponseBodypublic void run(HttpServletRequest req, HttpServletResponse resp) throws IOException {resp.setContentType("text/html;charset=utf-8");Cookie[] cookies=req.getCookies();String username=req.getParameter("username");String password=req.getParameter("password");String data=req.getHeader("Host");//使用Servlet的方式获取Header头String accept=req.getHeader("Accept");resp.getWriter().write("你好呀"+username+password+data+accept);}
}
@Controller
public class UserController {@RequestMapping("/Java100")@ResponseBodypublic String run(@RequestHeader("User-Agent") String UserAgent,@RequestHeader("Host") String host) throws IOException {return UserAgent+host;//host=127.0.0.1:8080}
}
设计登陆界面:-----存储Session,获取Session我们在POSTman是无法模拟Session的,因此Session非常安全
@Controller
class UserController{@RequestMapping("/Java100")@ResponseBodypublic String login(HttpServletRequest req, String username, String password, HttpServletResponse resp) throws IOException {if(password==null||password.equals("")||username==""||username.equals("")){return "用户名或者密码错误";}if(!username.equals("李佳伟")||!password.equals("12503487")){return "用户名错误或者密码错误";}HttpSession httpSession=req.getSession(true);
//自动根据SessionID去查找HttpSession
//没有回话就创建会话,r如果有回话就使用会话,没有回话就创建会话httpSession.setAttribute("username",username);resp.sendRedirect("/Java101");return "";}@RequestMapping("/Java101")@ResponseBodypublic String GetSession(HttpServletRequest req){HttpSession session=req.getSession();if(session==null||session.equals("")){return "当前用户没有进行登录";}String username=(String)session.getAttribute("username");if(username==null||username.equals("")){return "当前用户没有进行登录";}return username+"当前用户已经登陆成功";}
}
下面写一种更加简单的获取Session的方法:(两种方法)
@RequestMapping("/Java101")@ResponseBodypublic String GetSession(@SessionAttribute(value="username",required = false) String username){
//required=false,表示如果不进行添加的话那么当Session中不存在该属性的时候会发生报错return username;}
小结:SpringMVC进行获取用户的请求信息:
Session:Map<String,Object>
String:SessionID,Object:HttpSession
0)以后的SessionID返回给客户端之后,下一次客户端再次访问浏览器的时候
Cookie:JSESESSIONID:一大堆字符串------>等价于是SessionID
1)获取到单个参数:我们在方法里面进行获取到对应的参数就可以实现(方法名的参数和前端的参数要一致)
2)获取对象:在方法里面直接写对象就可以进行实现,但是对象中的属性要和前端url或者表单的参数是一致的
3)获取到JSON对象:@RequestBody加到方法的参数的前面,表示服务器要进行读取JSON格式的数据
4)获取文件:@RequestPart,里面填写的是前端已经上传的key的属性+@MultipartFile+自定义名字
5)获取用户的Cookie/Session/Header:
@CookieValue(里面填写的是已知Cookie字段中的Key)+String XXX
/@SessionSttribute(value=里面填写的是HttpSession中的Key)+String xxx
1)会自动根据SessionID来进行获取到Session键值对中的HttpSession
2)还会自动根据里面填写的value中的值作为HttpSession中的Key
3)根据HttpSession中的Key来自动获取到Session字段并填充到咱们的String里面
4)如果说此时客户端请求的Http报文里面没有Session信息那么代码会直接报错,返回400直接报错
/@RequestHeader(里面填写的是HTTP请求报文中的原字段名)+String XXX
相关文章:
SpringMVC(2)
一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...
Jackson序列化json时null转成空串或空对象
在项目中可能会遇到需要将null转"",可以通过以下方法解决。一:添加JacksonConfig 配置import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.Objec…...
如何将Python的上级目录的文件导入?【from.import】
假如有如下目录: -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办? 首先将其上级目录添加到系统目…...
Java实现碧蓝航线连续作战
目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对 移动鼠标…...
Docker笔记
文章目录1.docker为什么会出现2.docker是什么3.传统虚拟机和容器的对比3.1虚拟机3.2容器虚拟化技术3.3两者对比3.4为什么Docker会比VM虚拟机快?4.docker能干嘛6.docker的应用场景7.docker三要素一:镜像(Image)二:容器&…...
情人节使用AI TOOL来创建一个甜言蜜语的女伴
一、首先使用chatgpt生成一段情侣间的对话,需要反复几次,达到满意的程度,然后将女方的话归在一起。 这是一个情侣私下谈话的场景,女方表示对男朋友精心准备的情人节安排和礼物表示很满意 二、 打开网站:https://lexic…...
G-GhostNet(IJCV 2022)原理与代码解析
paper:GhostNets on Heterogeneous Devices via Cheap Operationscode:https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路,用于CPU端的C-GhostNet和用于GPU端…...
Ethercat系列(5)TWcat3激活过程的协议分析(续1)
顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层,广播写错误计数器主-》从从…...
QT入门Input Widgets之QScrollBar
目录 一、界面布局功能 1、界面位置介绍 2、控件界面基本属性 2.1 horizontalScrollBar界面属性 3、样式设置 此文为作者原创,创作不易,转载请标明出处! 一、界面布局功能 1、界面位置介绍 QScrollBar主要分为两种,一种垂直…...
【ML】基于机器学习的心脏病预测研究(附代码和数据集,多层感知机模型)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 之前创作过心脏病预测研究文章如下: 【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型) 【ML】基于机…...
工序排序问题--约翰逊法精讲
什么是约翰逊法?约翰逊法是作业排序中的一种排序方法。选出最短加工时间i*,若最短加工时间有多个,任选1个.若i*出现在机床1,它对应的工件先安排加工,否则放在最后安排,安排后划去该工件,重复上两个步骤,直…...
WebDAV之葫芦儿·派盘+网盘精灵
网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理...
计算机网络期末知识点总结
计算机网络期末知识点总结第四章—网络层:数据面4.1概述4.2虚电路和数据报网络4.3路由器工作原理4.4网际协议:因特网中的转发和编址第五章 网络层:控制面5.1路由选择算法5.2路由器中的路由选择5.3广播和多播路由选择第六章 链路层(…...
【Vue3 组件封装】vue3 轮播图组件封装
文章目录轮播图功能-获取数据轮播图-通用轮播图组件轮播图-数据渲染轮播图-逻辑封装轮播图功能-获取数据 目标: 基于pinia获取轮播图数据 核心代码: (1)在types/data.d.ts文件中定义轮播图数据的类型声明 // 所有接口的通用类型 export typ…...
电力国家(行业)标准目录
1、3~63kV交流高压负荷开关 GB 3804-90 代替 GB 3804-882、电气装置安装工程35kV及以下架空电力线路施工及验收规范Code for construction and acceptance of 35kVand umder over head power levels electricequipment installation engineeringGB50173—923、带电作…...
如何实现倒序输出
问题 如何实现字符串的大小写转换并倒序输出。 方法 采用Java自带的类方法进行倒序。 package homework4; public class Blog09 { public static void main(String[] args) { String a "HelloWord"; String a2 a.toUpperCase(); String a3 …...
遗留系统的自动化测试策略和实践方法
1 什么是遗留系统 遗留系统是一种旧的方法、旧的技术、旧的计算机系统或应用程序,属于或与以前的、过时的计算机系统有关,但仍在使用中。通常,将系统称为“遗留系统”意味着它可能已经过时或需要更换,但是系统还在对外提供服务,还在不断的迭代,有新的需求不断的交付。Ma…...
【Android】系统源码下载及编译
源码及编译 步骤 1:创建一个空目录来存放源码: mkdir aosp cd aosp步骤 2:获取最新版本的 repo 并签出 android-8.1.0_r1 分支: repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1其中&am…...
基于HTML实现浪漫情人节表白代码(附源代码)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
PCL 平面拟合——RANSAC
文章目录 一、基本思想二、代码示例1、参数选择2、核心代码3、完整代码4、结果展示三、关于 RANSAC 的一些思考参考文献一、基本思想 随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法,从一系列包含有离群值的数据中计算数学模型参数的方法。RANSAC算法本…...
【Linux之Shell脚本实战】监控系统的磁盘空间使用率
【Linux之Shell脚本实战】监控系统的磁盘空间使用率 一、脚本要求二、检查本地系统环境1.检查系统版本2.检查系统内核版本三、编写disk.sh脚本1.创建脚本目录2.编写disk.sh脚本3.执行测试脚本四、查看脚本执行日志文件五、本次实践总结1.脚本定时执行2.实践总结一、脚本要求 1.…...
【Python安全编程】Python实现网络主机和端口扫描
文章目录前言环境准备Python实现主机扫描基于ARP协议基于ICMP协议普通版本多线程版本Python实现端口扫描扫描单个端口利用多线程扫描端口后记前言 本文主要讲几个利用Python实现网络扫描的小例子,可以结合多线程或多进程编程改进实例 我曾经走过多遥远的路 跨越过多…...
四大垃圾回收算法七大垃圾回收器
JVM的运行时内存也叫做JVM堆,从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间,老年代默认占2/3堆内存空间,永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和SurvivorTo区, Eden…...
P1217 [USACO1.5]回文质数 Prime Palindromes
[USACO1.5]回文质数 Prime Palindromes 题目描述 因为 151151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151151 是回文质数。 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)[a,b] (5 \le a < b \l…...
用大白话给你科普,到底什么是 API(应用程序编程接口)?
何为API?如果你在百度百科上搜索,你会得到如下结果:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…...
企业电子招采系统源码——信息数智化招采系统
信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…...
【vnc】Ubuntu20.04+vnc安装和配置(中文输入法)
Ubuntu20.04vnc安装和配置(中文输入法) 安装vnc 用以下apt 命令安装: sudo apt install tigervnc-common tigervnc-standalone-server tigervnc-viewer tigervnc-xorg-extension注意,要用standalone-server版本,不要下载Tiger官方安装包&a…...
【排序算法】数据结构排序详解
前言: 今天我们将讲解我们数据结构初阶的最后一部分知识的学习,也是最为“炸裂”的知识---------排序算法的讲解!!!! 目录1.排序的概念及其运用1.1排序的概念1.2排序运用2.常见排序算法的实现2.1 插入排序2…...
【docker知识】DockerFile语法 1:注释指令、解释器指令
一、说明 在docker的指令下工作,似乎很简单,然而,对于复杂工程,这些初级知识是不够的。正确使用DockerFile构建镜像是必须的技能。我们这里假定您已经熟练docker的指令,我们继续上升一个台阶,如何用build和…...
[失业前端恶补算法]JavaScript leetcode刷题top100(一)
专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷 今天更新五个 easy 难度题目: 两数之和 题面 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的…...
大学生做的美食网站/天津抖音seo
在执行optimize表时,如果出现Repair with keycache时,说明tmp空间不够了...这时MySQL性能极低,又不能冒然kill掉进程,所以耐心等待操作完成吧。而内存足够的情况下,这种过程应该是提示Repair by sorting。如何避免这种…...
组合wordpress源码/seo初级入门教程
1、介绍 .net一般指.Net Framework框架。一种平台,一种技术。 C#是一种编程语言,可以开发基于.net平台的应用。 .Net Framework是框架是.Net平台不可缺少的一部分,它提供了一个稳定的环境来保证我们基于.Net平台开发的各种应用能够正常的运转…...
ps做网站的常用素材/学电商出来一般干什么工作
去年的一加7 Pro在市场上反应良好,因为其加大投入与创新,搭载了2K 90Hz屏幕,让一加7 Pro成为真旗舰。但是直到现在,一加现有机型上依然缺失了一个大多数旗舰标配的功能,无线充电。此前刘作虎曾多次回答过这个问题&…...
上海网站建设网页设计/舆情系统
有木有小伙伴经常纳闷,为什么明明大家拿到的都是同样的数据,但是别人做出来的图表就是特别好看呢?有时候绞尽脑汁花了好长时间做出来的图表还不如别人花三分钟做出来的图表,太挫败了有木有!别急!小编今天就…...
网站设计网站建设专业/百度app下载官方免费下载安装
目录 单点登录简介SSO&CAS是什么单点登录适合什么场景单点登录的三种实现方式CAS的几个重要知识点CAS的实现过程单点登录简介 单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获…...