获得徽章 1
- #青训营笔记创作活动#
2月16日 day32
今日学习
🍙名词约定
全局会话
在SSO登录页面登录后,我们就认为建立起了全局会话
判定标志
SSO页面的session存在且未过期
局部会话
在各个子系统,是否已经登录过,这个我们称为局部会话
判定标志
子系统存在可行的token【未过期且有效】
ticket
SSO系统颁发给子系统的凭证,有此凭证且有效的话,表明SSO系统允许子系统去建立局部会话【生成token】
token
子系统的访问凭证,各个子系统的token是不一样的,具体视业务而定,子系统也需要配置相应的拦截器来检测token
SSO登录
当SSO登录页面登录成功后,会存储一份session,建立起会话,表示全局会话已存在 session我们这里就不再过多赘述,想了解更多的话可以参考本专栏往期内容展开评论点赞 - #青训营笔记创作活动#
2月15日 day31
今日学习
什么是跨域问题?
跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 但这个保护机制也带来了新的问题,它的问题是给不同站点之间的正常调用,也带来的阻碍
1.跨域三种情况
在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:
协议不同,如 http 和 https;
域名不同;
端口不同。
也就是说,即使域名相同,如果一个使用的是 http,另一个使用的是 https,那么它们也属于跨域访问。
2.解决跨域问题
在 Spring Boot 中跨域问题有很多种解决方案,比如以下 5 个:
使用 @CrossOrigin 注解实现跨域;
通过配置文件实现跨域;
通过 CorsFilter 对象实现跨域;
通过 Response 对象实现跨域;
通过实现 ResponseBodyAdvice 实现跨域。
展开评论点赞 - #青训营笔记创作活动#
2月14日 day30
今日学习
http状态码
一般来说,前端并不存储太多数据,大部分都需要从后端服务器获取数据前后端需要建立tcp链接,在此基础上传数据
HTTP状态码用来表示响应结果的状态,其中200是正常响应,4xx是客户端错误,5xx是服务端错误。
客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。
展开评论点赞 - #青训营笔记创作活动#
2月13日 day29
今日学习
如何设计网络
从单机到互联 本质是通信问题
计算机是由电路板,晶体管组装起来的,无论图像渲染,数据处理还是远程共享,都是0与1的信号处理;
通信 的媒介是铜线,光纤,wifi,只要是物理层表示和1的二进制的运输载体,那么计算机就可以通信,通信的目的是传送数据
于是从每一台相互独立的计算机都被称为单机,到后来电脑之间相互联系,称之为互联展开评论点赞 - #青训营笔记创作活动#
2月12日day28
今日学习
日常工作或学习中,我们经常会遇到英文的bug,或者需要阅读英文文档
1. 如果在出差的路上,或者咖啡馆,或者自习室,可以拿出英文资料,或者是需要查看的技术文档,或者需要学习的产品手册。将不能够准确理解的段落、句子、单词摘抄到随身携带的抄写本上,这样便于针对细节深入处理。
2. 对于原文流程图下方的注解的学习过程。
3. 使用电脑打字的速度要比用手抄本写笔记的速度要快
如果百度无法解决,使用google
Stack Overflow有很多大家遇到问题的解决方案
或者看下方法的源文档,来理解方法的真实意图
展开评论点赞 - #青训营笔记创作活动#
2月10号 day27
今日学习
1.什么是kafka
kafka和传统的消息系统都具有系统解藕,冗余存储,流量削峰,缓冲,异步通信,扩展性,可恢复性等功能
把消息持久化到磁盘,有效降低了数据丢失的风险,
不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库
展开评论点赞 - #青训营笔记创作活动#
2月9日 day26
今日学习
知道电脑ip,就可以发送ip连接请求,建立连接后就可以操作收发数据.
最重要的就是发送端和接收端的ip.
插上网线有两种方式获得ip.
1.自己动手在电脑里配置,
2.DHCP动态主机配置协议
原理 向某个管ip分配的服务器,申请地址.展开评论点赞 - #青训营笔记创作活动# 2月8日 day 25
今日学习
利用Optional解决空指针异常
背景介绍
Java 8 引入了一个十分实用的 Optional 类,它主要是为了解决空指针异常(NullPointerException)。当我们对对象的属性进行检查,判断它的值是否为期望的格式,最终却发现我们查看的并不是一个对象,而是一个空指针,它会立即抛出一个让人厌烦的 NullPointerException 异常。
本质上,Optional 类是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
例子
从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
复制代码
为了确保不触发异常,需要在访问每一个值之前对其进行明确地检查:
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String isocode = country.getIsocode();
if (isocode != null) {
isocode = isocode.toUpperCase();
}
}
}
}
复制代码
为了简化这个过程,我们使用 Optional 优化这些代码。展开评论点赞 - 2月7日 day24
今日学习
nil interface 和 nil interface 的区别
虽然 interface 看起来像指针类型,但它不是。interface 类型的变量只有在类型和值均为 nil 时才为 nil如果你的 interface 变量的值是跟随其他变量变化的,与 nil 比较相等时小心。如果你的函数返回值类型是 interface,更要小心这个坑:
func main() {
var data *byte
var in interface{}
fmt.Println(data, data == nil) // <nil> true
fmt.Println(in, in == nil) // <nil> true
in = data
fmt.Println(in, in == nil) // <nil> false // data 值为 nil,但 in 值不为 nil
}
// 正确示例
func main() {
doIt := func(arg int) interface{} {
var result *struct{} = nil
if arg > 0 {
result = &struct{}{}
} else {
return nil // 明确指明返回 nil
}
return result
}
if res := doIt(-1); res != nil {
fmt.Println("Good result: ", res)
} else {
fmt.Println("Bad result: ", res) // Bad result: <nil>
}
}
复制代码
50.select可以用于什么
常用于goroutine的完美退出。
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。
#青训营笔记创作活动#展开评论点赞 - #青训营笔记创作活动#
2月6日 day23
今日学习
在 range 迭代 slice 时,你怎么修改值的
在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址。
func main() {
data := []int{1, 2, 3}
for _, v := range data {
v *= 10 // data 中原有元素是不会被修改的
}
fmt.Println("data: ", data) // data: [1 2 3]
}
如果要修改原有元素的值,应该使用索引直接访问。
func main() {
data := []int{1, 2, 3}
for i, v := range data {
data[i] = v * 10
}
fmt.Println("data: ", data) // data: [10 20 30]
}
如果你的集合保存的是指向值的指针,需稍作修改。依旧需要使用索引访问元素,不过可以使用 range 出来的元素直接更新原有值。
func main() {
data := []*struct{ num int }{{1}, {2}, {3},}
for _, v := range data {
v.num *= 10 // 直接使用指针更新
}
fmt.Println(data[0], data[1], data[2]) // &{10} &{20} &{30}
}
nil interface 和 nil interface 的区别
虽然 interface 看起来像指针类型,但它不是。interface 类型的变量只有在类型和值均为 nil 时才为 nil如果你的 interface 变量的值是跟随其他变量变化的,与 nil 比较相等时小心。如果你的函数返回值类型是 interface,更要小心这个坑展开评论点赞