Bugs & Sols 记录

React

React Native

Spring Boot

Spring Security

  • 默认启动 Spring Security 的 csrf 防护时 不对 get 做限制 但是会要求其他类型的请求带上 csrftoken(就是在前端表单里隐藏提交的那个东西) 因此会导致服务间发送请求被拒 关闭 csrf 即可 有 ip 限制就够了

  • Spring Boot 6 之后如何对请求的 ip 地址进行限制:https://blog.csdn.net/weixin_43162683/article/details/135946939

  • Security 处理登录和 session 的逻辑:使用 session 最简单的情况就是把 session 存到一个 map 里维护即可 而 security 为了方便 还多做了几步操作 见下图:

  • Security 中如何判断 session 是否有效(千万别用 isNew):https://blog.csdn.net/lisheng19870305/article/details/40738169/

Spring Cache

  • 沟槽的 springcache 注解 因为 aop 要走 spring 框架代理的原因 如果在同一个 service 里拆分两个函数 一个函数写 cache 注解 另一个函数进行调用 这样的方式是不走代理的 也就不会生效 只能重新写一个 service 或者提取到 controller 里

Open Feign

  • 因为懒得使用外部中间件实现负载均衡 所以自定义一层 lbservice 使用 openfeign 自带的 ribbon 进行负载均衡 然后涉及到了 openfeign 如何在请求里带上 cookie 以及响应中的 setcookie 如何返回的问题 解决方法是配置一个 config 类继承 springdecoder 这样才能保留原来的自动选择 decoder 的特性 否则没法选择合适的 decoder 比如 json 和 text 需要的 decoder 就不一样

  • 沟槽的 openfeign:如果要使用 requestparam、pathvariable 注解 必须显式声明 value 否则无法解析

WebSocket

  • 注意第一次建立连接的请求看似是 ws 协议 实际上是 http 请求 后续升级为 ws 协议 部署到服务器后 由于 nginx 代理会把这个 http 请求转发给前端文件夹 需要进行配置转发 原理同后端的配置 主要是需要几个升级协议头 见:https://blog.csdn.net/wx_l617188072/article/details/134548473

Redis

Nacos

  • nacos 的注册逻辑:nacos 是自动帮你把服务的 ip 进行发现并注册 并不是随便选一个 ip 然后把服务放到这个 ip 上 因此实际上 注册过程相当于 nacos 找到这个服务的 ip(可能是优先内网) 然后加入到服务列表 这样其他服务调用这个服务时 就会向服务列表里记录的 ip 发送请求 https://blog.csdn.net/weixin_48359973/article/details/132378494

  • 因为之前一直没搞懂 nacos 的注册逻辑 所以有些问题:

    • 两台服务器之间的容器的通信:在不同主机上的容器注册到 nacos 上后 发现无法互相调用 原因涉及到容器和宿主机的网络通信 由于容器和宿主机默认是以桥接模式形成内部局域网 而容器会部署到 172 开头的内网 ip 上 因此在容器内部 ping172 网段 实际上都是本宿主机内的其他容器 ip 而 nacos 自动注册时会把容器内的服务优先注册到这个 172 的网段 ip 这就导致了如果另一个主机内的容器调用这个服务 肯定是在 ping172 网段 实际上是在发送请求给本宿主机内的容器 肯定是不行的
    • 解决方法:(https://cloud.tencent.com/developer/article/1962232)
    1. 把桥接改为 host 模式 容器将会使用宿主机的 ip 注册时也就注册了宿主的 ip 其他容器去 ping 其他宿主机是可以的 因为 192 网段或者外网肯定是未被占用的
    2. 手动配置注册 ip 为宿主机的 ip(内网或者外网都可以) 端口映射都不用变 这样同理也可以 ping 通
  • 使用 Python-nacos 时 发现注册后服务总是自己挂掉 查看参数才知道 原来服务需要心跳机制来告诉 nacos 中心自己是否健康 springboot 中无需显式配置 会自动发送心跳 而 Python 需要显式设置参数 一般为 5s

ELK

Docker

  • builderKit 是用于在镜像 build 期间多阶段构建的插件 在使用时发现 --mount=type=bind指令无法挂载宿主机的目录 一般使用--mount=type=cache来缓存 mvn 或 pip 的依赖包

ML

杂项

  • 将后端改为使用 https 但前端仍为 http 时 会导致跨域问题 具体而言 服务器通过响应 body 里的 set-cookie 项来提供 cookie 其中有一个 samesite 属性用于告诉浏览器(客户端)这个 cookie 在什么时候需要发送 如果响应体里没有 samesite 属性 浏览器默认设置其为 lax 这会导致后端只能在不跨站(前端后端 url)的情况下发送 cookie 解决方法是后端显式设置 samesite 为 none 即不管何时都发送

    参考 https://zhuanlan.zhihu.com/p/675629457

    顺便说一下跨域和跨站的区别:

    • 跨域=不同源 同源=协议+域名+端口相同 CORS 协议浏览器为了防止潜在的黑客攻击(比如暗中让你把请求发给其他网站)而使用的
    • 跨站:先说明 eTLD+1 是什么东西 TLD(顶级域名)是记录在一个列表中的所有最高级别域名 比如常见的 com eTLD 则是有效顶级域名 是 TLD 再往前加一个点 +1 显然就是再加一层域名 eTLD+1 部分的域名相同=不跨站
  • js 中的对象赋值都是按引用传递的 这意味着如果你不进行显式的深拷贝 就会莫名其妙改变父组件的参数 注意赋值时用复制对象而不是简单的”=”即可

  • Android Studio 启动报错:https://zhuanlan.zhihu.com/p/636061626

  • Ubuntu 使用 apt 安装的 nodejs 版本太低了 如何安装 v18:https://blog.csdn.net/weixin_42582542/article/details/129982650


Bugs & Sols 记录
https://nwdnys1.github.io/2024/09/07/Bugs&Sols/
作者
nwdnysl
发布于
2024年9月7日
许可协议