xp
XP, Extreme Programing, 极限编程.
极限编程是一种轻量级的软件开发过程, 其关键价值是反馈, 交流, 简单和勇气.
concurrenthashmap
①, 重要的常量:
private transient volatile int sizeCtl;
当为负数时, -1 表示正在初始化, -N 表示 N - 1 个线程正在进行扩容;
当为 0 时, 表示 table 还没有初始化;
当为其他正数时, 表示初始化或者下一次进行扩容的大小.
②, 数据结构:
Node 是存储结构的基本单元, 继承 HashMap 中的 Entry, 用于存储数据;
TreeNode 继承 Node, 但是数据结构换成了二叉树结构, 是红黑树的存储结构, 用于红黑树中存储数据;
TreeBin 是封装 TreeNode 的容器, 提供转换红黑树的一些条件和锁的控制.
③, 存储对象时 (put() 方法) :
1.如果没有初始化, 就调用 initTable() 方法来进行初始化;
2.如果没有 hash 冲突就直接 CAS 无锁插入;
3.如果需要扩容, 就先进行扩容;
4.如果存在 hash 冲突, 就加锁来保证线程安全, 两种情况: 一种是链表形式就直接遍历到尾端插入, 一种是红黑树就按照红黑树结构插入;
5.如果该链表的数量大于阀值 8, 就要先转换成红黑树的结构, break 再一次进入循环
6.如果添加成功就调用 addCount() 方法统计 size, 并且检查是否需要扩容.
④, 扩容方法 transfer(): 默认容量为 16, 扩容时, 容量变为原来的两倍.
helpTransfer(): 调用多个工作线程一起帮助进行扩容, 这样的效率就会更高.
⑤, 获取对象时 (get()方法) :
1.计算 hash 值, 定位到该 table 索引位置, 如果是首结点符合就返回;
2.如果遇到扩容时, 会调用标记正在扩容结点 ForwardingNode.find()方法, 查找该结点, 匹配就返回;
3.以上都不符合的话, 就往下遍历结点, 匹配就返回, 否则最后就返回 null.
1. Tode
- 阅读源码
2. Resource
iproute2
资料库
1. 网站
1.1. 社区
- CSDN
- 开源中国社区
- 阿里云溪社区
- 腾讯云社区
- 华为云社区
- ITEYE
- ImportNew
- InfoQ
- 红黑联盟
- 现代魔法
- 图灵社区
- 博客园
- CSDN 博客
- 极客学院
- Segment Fault
- 掘金
- 简书
- IBM DeveloperWorks
- 安全客
- 高级语言虚拟机社区
1.2. 教程
- 菜鸟教程
- 51CTO学院
- CSDN学院
- 慕课网
- W3School
- 各类语言 API 文档
- 腾讯大学
- 百度技术学院
- 百度营销大学
- 廖雪峰博客
- 阮一峰博客
- ifeve
- skywang的博客
- 架构师之路17年精选80篇
- Java 面试笔记
1.3. 代码
1.4. 问答
1.5. 资讯
1.6. 项目
- Github 优质项目推荐 TOP 100
- Awesome 系列
- Kotlin 官方 Awesome
- Awesome Kotlin
- Awesome Java
- 必学Java类库/常用Java类库大全
- Awesome Selenium
- Awesome Rest
- Awesome Gradle Plugin
- Awesome Microservices
- Spring
- Awesome
- Awesome Java
- Awesome Java 中文版
- 免费的编程中文书籍索引
- Java 设计模式
- IT 面试指南
- Arthas
- Greys Anatomy (Arthas 的前身)
- 实用 Java 调试脚本
1.7. 规范
JCP1.8. 下载
- 微盘
- 百度云
- CSDN
1.9. API
1.10. 赚钱
1.11. 出版社
2. Resource
web-security
1. Web安全漏洞
提到的10大Web应用安全问题:
- 注入
- 失效的身份认证
- 敏感信息泄露
- XML外部实体(XXE)
- 失效的访问控制
- 安全配置错误
- 不安全的反序列化
- 含有已知漏洞的组件
- 不足的日志记录和监控
其他还有:
- 界面劫持
2. 安全策略
- 绝对不信任任何客户端提交的数据.
https://docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/reference/htmlsingle/#getting-started
CORS
CORS, Cross-Origin Resources Sharing, 跨域资源共享.
允许浏览器向跨域服务器请求资源, 从而让AJAX克服同源策略.
CORS需要浏览器和服务器同时支持.
随着W3C标准的推动, 目前所有浏览器都支持CORS.
CORS请求与同源的AJAX请求代码没有差别.
但当浏览器发现AJAX请求跨域资源时, 会自动添加一些附加的头信息, 有时还会多出一次附加的请求.
整个过程有浏览器自动完成, 不需要用户参与.
1. 2种请求模式
1.1. 简单模式
简单模式, 浏览器直接向服务器发起简单类型跨域请求, 浏览器与服务器之间请求只进行一次.
需要满足以下2个条件:
- 使用下列方法之一:
- GET
- HEAD
- POST
- HTTP的头信息不超过以下几种:
- Accept
- Accept-Languagebkk
- Content-Language
- Last-Event-ID
- Content-Type, 该字段值必须是application/x-www-form-urlencoded, multipart/form-data, 或text/plain.
不满足简单模式的条件, 则需要使用预检模式.
1.1.1. 简单模式流程
浏览器发现AJAX请求为跨域请求, 且是简单模式, 就会自动在头信息中添加Origin字段.
1 | GET /cors HTTP/1.1 |
Origin字段说明了本次请求来自哪个域(协议, 域名及端口).
服务器根据该字段, 决定是否同一这是请求.
如果Origin指定的域不在许可返回内, 服务器就会返回一个正常的HTTP响应, 且响应头中不包含Access-Control-Allow-Origin字段.
浏览器发现没有Access-Control-Allow-Origin字段, 就知道出错了.
跨域请求失败无法通过状态码来识别, 因为状态码有可能是200.
如果Origin指定的域在许可返回内, 那服务器返回的响应, 会多出几个头信息字段.
1 | Access-Control-Allow-Origin: http://api.bob.com |
1.1.2. Access-Control-Allow-Origin
该字段在响应头中必定存在, 标识哪些域允许跨域.
可以是域列表;也可以是*, 表示允许任意域.
1.1.3. Access-Control-Allow-Credentials
CORS请求默认不发送Cookie.
如果服务器不需要Cookie, 则删除该自动即可.
Access-Control-Allow-Credentials若为true, 则Access-Control-Allow-Origin不能为*, 这也是出于安全考虑.
若需要发送Cookie, 则需要:
- 客户端设置AJAX请求打开
withCredentials属性:
1 | var xhr = new XMLHttpRequest();bkk |
- 服务器明确同意接收Cookie
1 | Access-Control-Allow-Credentials: true |
1.1.4. Access-Control-Expose-Headers
XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma.
如果需要获取其他字段, 就必须在Access-Control-Expose-Headers中指定.
1.2. 预检模式 preflight
预检模式, 会在正式请求之前, 先发起一次预检请求.
先询问服务器, 当前域是否在许可范围内, 允许哪些请求方法以及需要哪些头信息字段.
只有得到服务器肯定答复后, 才会发起正式的请求, 否则报错.
1.2.1. 预检请求
当浏览器发现, 这是一个非简单模式的请求, 就会自动发起一个预检请求.
1 | OPTIONS /cors HTTP/1.1 |
预检请求使用OPTIONS方法, 表示用来询问的.
同样也有Origin关键字段.
1.2.2. Access-Control-Request-Method
该字段用来列出CORS请求会用到哪些HTTP方法, 如上面的PUT.
1.2.3. Access-Control-Request-Headers
该字段值是一个以逗号分隔的字符串, 用来指定浏览器CORS请求会额外发送的头信息字段, 如上面的X-Custom-Header.
1.2.4. 预检请求响应
服务器收到预检请求, 检查Origin, Access-Control-Request-Method, Access-Control-Request-Headers.
如果服务器否定了预检请求, 会返回一个正常的HTTP响应, 但其中不包括Access-Control-*.
浏览器会认定为不同意预检请求, 触发错误.
控制台会打印如下报错信息:
1 | XMLHttpRequest cannot load http://api.alice.com. |
如果确认允许跨域, 给出回应.
1 | HTTP/1.1 200 OK |
确认通过预检请求之后, 才会发起正常CORS请求, 流程与简单模式一样.
1.2.5. Access-Control-Allow-Methods
该字段必须, 为了避免多次预检, 返回的是服务器支持的所有跨域请求方法.
1.2.6. Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Allow-Headers, 则响应中也必须有该字段.
同样包含了所有服务器支持的头信息字段, 防止多次预检.
1.2.7. Access-Control-Max-Age
可选字段, 表示预检请求有效期, 单位为秒.
如上面的1728000, 则表示20天内不用发起另一条预检.
2. Resource
url
1. URL
一般格式如下:
1 | <scheme>://<netloc>/<path>?<query>#<fragment> |
比如:
1 | http://www.foo.com/path/f.php?id=1&type=cool#new |
对应的关系是:
1 | <scheme> - http |
URL的编码方式有3类:escape, encodeURI, encodeURIComponent, 对应的解码函数是:unescape, decodeURI, decodeURIComponent.
这3中编码函数是有差异的, 甚至在自动URL编码中也存在差异.
2. 同源策略
同源策略是众多安全策略中的一个, 是web层面上的策略.
同源策略规定:不同域的客户端脚本在没有明确授权的情况下, 不能读写对方的资源.
2.1. 同域
同域是指URL的协议, 域名, 端口都相同.
例如, 以下URL是否与http://www.foo.com同域:
| url | 是否同域 | 原因 |
|---|---|---|
| https://www.foo.com | No | 协议不同 |
| http://abc.foo.com | No | 子域名不同 |
| http://foo.com | No | 域名不同 |
| http://www.foo.com:8080 | No | 端口不同 |
| http://www.foo.com/a/ | Yes | 协议, 域名, 端口都相同, 只是多了一个目录 |
2.2. 客户端脚本
主要是指:JavaScript, ActionScript.
2.3. 授权
例如HTML5新标准中提到关于AJAX跨域访问的情况, 默认情况下是不允许跨域访问的, 只有目标站点(假如是http://www.foo.com)明确返回HTTP响应头:
1 | Access-Control-Allow-Origin: http://www.evil.com |
那么www.evil.com站点上的客户端脚本就有权通过AJAX技术对www.foo.com上的数据进行读写操作.
2.4. 读写权限
Web上的资源有很多.
有的只有读权限, 比如HTTP请求头里的Referer(表示请求来源).
有的具备读写权限, 比如document.cookie.
这样区分是出于安全上的考虑.
2.5. 资源
资源是一个很广泛的概念, 只要是数据, 都可以认为是资源.
同源策略里的资源是指:Web客户端的资源.
一般来说, 包括:HTTP消息头, 整个DOM树, 浏览器存储(Cookie, FlashCookie, localStorage等)
3. Resource
- Web前端–黑客技术揭秘
vagex
axel
命令行下载工具
1. option
- -a 替换进度条
- -n 连接数
- –header key:value, -H key:value 请求头
- -T x 超时时间
2. 举例
1 | axel -a -n 100 --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/9.0.4+11/c2514751926b4512b076cc82f959763f/jdk-9.0.4_linux-x64_bin.tar.gz |