0%

XP, Extreme Programing, 极限编程.
极限编程是一种轻量级的软件开发过程, 其关键价值是反馈, 交流, 简单勇气.

①, 重要的常量:
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

1. 网站

1.1. 社区

1.2. 教程

1.3. 代码

1.4. 问答

1.5. 资讯

1.6. 项目

1.7. 规范

JCP

1.8. 下载

  • 微盘
  • 百度云
  • CSDN

1.9. API

1.10. 赚钱

1.11. 出版社

2. Resource

1. Web安全漏洞

提到的10大Web应用安全问题:

  • 注入
  • 失效的身份认证
  • 敏感信息泄露
  • XML外部实体(XXE)
  • 失效的访问控制
  • 安全配置错误
  • 不安全的反序列化
  • 含有已知漏洞的组件
  • 不足的日志记录和监控

其他还有:

  • 界面劫持

2. 安全策略

  • 绝对不信任任何客户端提交的数据.

https://docs.spring.io/spring-security/site/docs/4.2.3.RELEASE/reference/htmlsingle/#getting-started

CORS, Cross-Origin Resources Sharing, 跨域资源共享.
允许浏览器向跨域服务器请求资源, 从而让AJAX克服同源策略.
CORS需要浏览器和服务器同时支持.
随着W3C标准的推动, 目前所有浏览器都支持CORS.

CORS请求与同源的AJAX请求代码没有差别.
但当浏览器发现AJAX请求跨域资源时, 会自动添加一些附加的头信息, 有时还会多出一次附加的请求.
整个过程有浏览器自动完成, 不需要用户参与.

1. 2种请求模式

1.1. 简单模式

简单模式, 浏览器直接向服务器发起简单类型跨域请求, 浏览器与服务器之间请求只进行一次.

需要满足以下2个条件:

  1. 使用下列方法之一:
  • GET
  • HEAD
  • POST
  1. 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
2
3
4
5
6
GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

Origin字段说明了本次请求来自哪个域(协议, 域名及端口).
服务器根据该字段, 决定是否同一这是请求.

如果Origin指定的域不在许可返回内, 服务器就会返回一个正常的HTTP响应, 且响应头中不包含Access-Control-Allow-Origin字段.
浏览器发现没有Access-Control-Allow-Origin字段, 就知道出错了.
跨域请求失败无法通过状态码来识别, 因为状态码有可能是200.

如果Origin指定的域在许可返回内, 那服务器返回的响应, 会多出几个头信息字段.

1
2
3
4
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

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, 则需要:

  1. 客户端设置AJAX请求打开withCredentials属性:
1
2
var xhr = new XMLHttpRequest();bkk
xhr.withCredentials = true;
  1. 服务器明确同意接收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
2
3
4
5
6
7
8
OPTIONS /cors HTTP/1.1
Origin: http://api.bob.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

预检请求使用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
2
XMLHttpRequest cannot load http://api.alice.com.
Origin http://api.bob.com is not allowed by Access-Control-Allow-Origin.

如果确认允许跨域, 给出回应.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

确认通过预检请求之后, 才会发起正常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

1. URL

一般格式如下:

1
<scheme>://<netloc>/<path>?<query>#<fragment>

比如:

1
http://www.foo.com/path/f.php?id=1&type=cool#new

对应的关系是:

1
2
3
4
5
<scheme> - http
<netloc> - www.foo.com
<path> - /path/f.php
<query> - id=1&type=cool
<fragment> - new

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前端–黑客技术揭秘

命令行下载工具

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