Kindrage's blog

本性善良, 勇气满满

概念

Source of Truth:
value type: struct, enum, Int 等
reference type: class
observable:

@State 将 值类型 标记为 真实数据源

将property包装为 真实数据源(Source of Truth). 当@State property 修改时, 依赖的此property 的 View 都会刷新. @State 只能包装值类型(Value Type), 比如: struct, enum

@Bingding

@Binding 修饰的 property 可以与一个 单一数据源(Source of Truth), 共享读写. @Binding 不会直接存放数据

$ 语法

用 $变量名 , 可以创建Bingding

@ObservedObject, @StateObject, @EnvironmentObject 将 引用类型(reference type) 标记为 真实数据源(source of truth)

class 实现 ObservableObject 表示 class 是 可观察的(observable), 值修改需要重绘UI的属性, 用@Published 标记. published属性变化时, 会通知所有观察者

监听: UI组件通过 ObservedObject, StateObject, 或者 EnvironmentObject 标记属性, 来实现对 observable属性 的监听(成为该属性的观察者), 被标记的视图属性, 会创建对应的 真实数据源(source of truth)

创建 可观察对象 时用 @StateObject 声明. 要从外部传入的 可观察对象 用 @ObservedObject 声明.

一些特性

This limit of 10 children inside a parent actually applies everywhere in SwiftUI.
// SwiftUI很多View都限制最多只能10个子ViewGroup 可对子View分组来避免超过10个的限制,而且不会改变显示效果

阅读全文 »

GraphQL是一个API查询语言,它能够对现有API中的数据进行完整的和可理解的描述。
使客户端一次查询就能够准确的获取到想要的所有字段,不多也不少。
这样随着时间的推移,使得API开发升级更容易。 GraphQL也提供了强大的开发工具,协助我们在开发过程中更方便的写查询语句。
官网入口

阅读全文 »

WebSocket是一个基于单tcp连接支持全双工双向通信的协议. 通俗来讲,就是用webscoket,服务端就可以主动给浏览器推消息了.
它支持文本字节两种类型的消息, 但是消息内容没有规定.
但 WebSocket支持client和server 协商一个子协议来发送消息, 子协议可以更好的约定消息内容的格式.

STOMP (Simple Text Oriented Messaging Protocol) , 就是我们要用到的子协议. 它旨在解决常用消息传递模式的最小子集, 可以在任何可靠的双工通信网络协议上使用, 如TCP和WebSocket.
虽然 STOMP是面向文本的协议, 但是也可以支持字节.

阅读全文 »

文章内容以翻译12为主。主要涉及如何使用和参数调优, 不涉及原理3

ZGC 全名 The Z Garbage Collector1, 是一个可伸缩的超低延迟垃圾回收器,主要目标是:

  • 亚毫秒 级的最大暂停时间
  • 暂停时间,不管堆、存活对象集、根对象集的大小怎么变化,都 不增长
  • 支持的堆大小: 8MB - 16TB

ZGC 最开始作为实验特性出现在 JDK 11 中, 在 JDK 15 时达到生产可用水平。
简而言之, ZGC :

  • 并行的
  • 基于分区的
  • Compacting3
  • NUMA 感知
  • colored pointers3
  • load barriers3

ZGC的核心是一个并发垃圾收集器,垃圾收集时,其它业务线程会继续执行,所以能极大地减小垃圾收集对应用程序响应时间的影响。

阅读全文 »

APR(Apache Portable Runtime) 是apache的一个项目,目的是创建和维护为特定平台底层实现的软件库并提供一致接口。Tomcat 查能通过JNI方式调用APR,提供卓越的可扩展性、性能以及与本机服务器技术更好的集成。

APR 有很多用途,包括访问高级 IO 功能(例如 sendfile、epoll 和 OpenSSL)、操作系统级功能(随机数生成、系统状态等)和本地进程处理(共享内存、NT pipes 和 Unix socket)。
有些东西也不知道是撒, 反正很好的样子, 下面看看怎么用起来

阅读全文 »

高屋建瓴的看一下spring security 在servlet应用中如何认证授权漏洞防护

filter 回顾

spring security 对于servlet应用的支持,主要是通过filter来实现。 回顾一下一个HTTP请求的处理过程:

filterchain

客户端向应用程序发送请求,容器创建一个 FilterChain,其中包含应该根据请求 URI 的路径处理 HttpServletRequest 的 Filters 和 Servlet 。 在 Spring MVC 应中,Servlet 是 DispatcherServlet 的一个实例。一个 HttpServletRequest 和 HttpServletResponse最多只能一个 Servlet 可以处理,但是,可以使用多个过滤器来做以下事情:

  1. 阻止下游过滤器或 Servlet 被调用。在这种情况下,过滤器通常会写入 HttpServletResponse
  2. 修改下游Filters和Servlet使用的HttpServletRequest或HttpServletResponse

Filter是通过传入进来的FilterChain 来实现这种操作的, 由于Filter只能影响下游的Filter和Servlet,所以Filter的顺序非常重要。

阅读全文 »

spring security 提供了完整的Authentication支持, 本文主要讨论:

架构组件

本节描述了用于 Servlet 身份验证的 Spring Security 的主要架构组件。如果您需要解释这些部分如何组合在一起的具体流程,请查看身份验证机制特定部分

  • SecurityContextHolder - SecurityContextHolder是Spring Security存储身份验
    证主体的详细信息的地方.
  • SecurityContext- 从 SecurityContextHolder 获得,包含当前已认证用户的认证信息.
  • Authentication - 可以是AuthenticationManager的输入(用户录入的信息,作为身份认证的凭据), 也可以是SecurityContext中的当前用户.
  • GrantedAuthority - Authentication 中授予主体的权限 (如: roles, scopes, etc.)
  • AuthenticationManager - 定义身份身份认证的api.
  • ProviderManager - AuthenticationManager 的一个常见实现.
  • AuthenticationProvider - ProviderManager用来执行指定类型的身份认证.
  • Request Credentials with AuthenticationEntryPoint- 用来从客户端获取用户凭证 (i.e. 重定向到登录页, 发送WWW-AuthenticateHeader 等.)
  • AbstractAuthenticationProcessingFilter - 做身份的父 Filter . 同时也是一个关于身份验证的总体流程以及各个部分如何协同工作的很好的建议。
阅读全文 »

无论是否使用spring-security的认证, 都可以使用spring-security的鉴权功能。

鉴权架构

权限 Authorities

认证的时候AuthenticationManager会把授予主体的权限(GrantedAuthoritys)存进Authentication里。后面用户访问应用资源的时候, AccessDecisionManager 会根据GrantedAuthority做鉴权, 判断用户是否有权限访问此资源。

GrantedAuthority 是一个接口, 只有一个方法:

1
String getAuthority();

AccessDecisionManager调用此方法等到一个String来表示权限。如果GrantedAuthority实现类不能转为String 应该返回null

GrantedAuthority有一个具体实现SimpleGrantedAuthority,可以把指定字符串转为 GrantedAuthority。spring security 认证体系中的所有AuthenticationProvider 都是用此类来填充Authentication对象。

阅读全文 »

SeaweedFS 是 key-file 存储引擎, 文件支持设置过期时间(TTL)。

用法

需要两步:

  1. 请求master分配一个有TTL 的文件id:

    1
    2
    # curl http://localhost:9333/dir/assign?ttl=3m
    {"count":1,"fid":"5,01637037d6","url":"127.0.0.1:8080","publicUrl":"localhost:8080"}
  2. 使用这个文件id 来存储文件

    1
    curl -F "file=@x.go" http://127.0.0.1:8080/5,01637037d6?ttl=3m

高级用法

上面例子中ttl=3m使用了两次, 一次是分配文件id, 一次是写数据。 第一个是让 master 选择匹配的卷,而第二个是与文件一起写入的。
两次TTL值其实可以不一样, 只要保证 第一次的比第二次大就可以

阅读全文 »
0%