Tomcat 在处理 Cookie 的时候的几个小坑

今天在代码中调用 HttpServletRequest  对象的 getCookies()  方法时,发现实际得到的 Cookie 数量与提交的不符。实际提交了 17 个 Cookie,但是获取到的只有 14 个。

经过排查,发现如果调用 getHeaders("Cookie")  方法,获取原始的 Cookie 串,是可以拿到正确的 17 个 Cookie 组成的字符串的。于是确认应该是 Tomcat 在处理 Cookie 的时候进行了过滤。

经过一番搜索,发现了这个文档:

http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html

其中,跟 Cookie 相关的参数有:

org.apache.tomcat.util.http. (更多…)

MySQL 低版本对 TIMESTAMP 字段 DEFAULT 值设置的一个问题

今天在线上改表的时候,遇到了一个问题。改表完成之后,MyBatis Select 改表前插入的数据会抛异常。排查后发现是因为一个 TIMESTAMP  类型的字段值被写成了 0000-00-00 00:00:00  ,无法被转换成 java 的 java.sql.Timestamp 类型,导致出错。

但是之前在使用 MySQL 的时候一直没有遇到过这个问题,于是搜索了一下,发现了这么一个链接:

https://bugs.mysql.com/bug.php?id=68040

这里反馈了一个 MySQL 本身的 Bug,会导致 ALTER table  的时候, TIMESTAMP  (更多…)

Nginx 诡异 SSL_PROTOCOL_ERROR 问题排查

这两天在检查一台 Nginx 配置的时候,遇到了一个极端诡异的问题。一段很通用的配置,配在这个服务器上,就会 100% 导致 Chrome 报 ERR_SSL_PROTOCOL_ERROR 。但是这段配置非常的通用,是用 Mozilla 提供的工具生成的。

而且在 iPhone 的 Safari 上访问又是完全正常的,服务器日志也看不到任何错误。看到的请求相应码也是完全正确的 200 。

先贴出配置:

可以看到是在 Mozilla 网站上选择  和 Modern 生成出来的配置。

在测试过程中,排查了各种问题,包括但不限于 SSL 证书问题,HTTP Basic Auth 问题,http2 问题等等,然而都没有解决这个现象。

一次偶然的尝试,发现只要注释掉我给这个 (更多…)

常见 NAT 类型描述对应关系

在不同的设备上,对于各种类型的 NAT 有各自不同的描述。先列举一下目前遇到的说法:

PS4

NAT类型 显示PS4™与互联网的连接方式
使用游戏的通信功能等时,可确认与其它PS4™间的连接稳定性。
Type 1:与互联网直接连接。
Type 2:通过路由器与互联网连接。
Type 3:通过路由器与互联网连接。
显示Type 3时,可能会出现无法与其它PS4™顺利通信,使PS4™的网络功能受到限制的情形。详细请参阅

XBox

OPEN NAT MODERATE NAT STRICT NAT
With an OPEN NAT type, you’re able to chat with other people, as well as join and host multiplayer games with people (更多…)

MySQL 分区表的一些问题

最近在使用 MySQL 分区表的时候,研究了一下多列 Range 分区,也就是

在多列的情况下,MySQL 的分区策略和单列略有不同,这也是比较坑的地方,查遍所有文档都没人提到。。。

先说说单列 Range 分区。比如,如果这么写:

那么,p1 中的数据是 a 值小于 0 的,注意,是小于,不包括 0 。然后,p2 中的数据是 a 值在 [0, 10) 之间的,注意右边是开区间,不包括 10 。同样的,p3 中的数据是 a 值在 [10, 20) 之间的,不包括 20 。

也就是说,如果有这么一条数据:

由于 a=10,所以会落入 p3 分区。

再来看多列分区,使用第一个多列分区语句,执行 (更多…)

nginx rewrite 的一个小坑

今天在配置 Nginx 的时候写了这么一个 location

然后发现当我直接访问 /a 的时候,rewrite 并没有生效,后端收到的还是 /a 而不是我想象中的 / 。想了想可能是结尾 / 的问题,于是这样改:

结果新的问题来了,由于这样匹配到的 $1 是空的,所以 Nginx 报错了,the rewritten URI has a zero length

所以这种情况下只好这么写:

注意第一行的末尾 / 。这种情况下,访问 /a 会被 Nginx 自动重定向到 /a/ ,然后重写之后的 uri 就是 /,问题解决。

Nginx client_max_body_size 不生效的奇怪问题

最近在配置 Nginx 的 client_max_body_size 的时候遇到了一个非常奇怪的现象,明明配置了这个设置但是却并没有生效。具体配置是这样的:

在实际测试中发现, /a/upload 这个接口上传文件还是会失败,而且大小确实是符合限制的。为了确认不是文件大小的问题,这里还尝试了使用了  client_max_body_size 0; 直接关掉限制,可是还是不起作用。查了很多日志都没找到问题,唯一比较奇怪的是,在错误日志中记录的 request method 与实际不符,日志中 $request_method  记录的是 GET,但是客户端上送的确实是标准的 POST, $request  (更多…)

Synergy 配置 SSL 失败的解决方法

在激活了 Synergy Pro 之后,会自动生成 SSL 证书并开启 SSL 加密。但是由于某个暂时还未知的 Bug,在 Mac 上第一次自动生成的证书总是不能用的,会报这样的错误:

需要这样解决:

  1. 在 Synergy Pro 的设置中取消勾选使用 SSL
  2. 关闭当前的 Synergy Pro
  3. 打开终端,进入 ~/Library/Synergy/SSL
  4. 删除目录下的所有文件
  5. 重新打开 Synergy Pro,在设置中勾选使用 SSL,软件会重新生成证书
  6. 停止原先的客户端,重新连接,在弹框中信任证书,问题解决。

如果在客户端连接的时候出现这样的问题:

说明客户端和服务端有某一方没有启用 SSL。请检查所有服务端和客户端,必须全部启用 (更多…)

Nginx 配置 ECC RSA 双证书

Config Nginx for parallel ECC and RSA Certificate

先决条件

Nginx 1.11.0 以上

OpenSSL 1.0.2 以上

申请证书

首先申请 ECC 证书,这个不多说,很多方法都可以,大部分 CA 现在也都可以签署。生成 CSR 的命令是:

拿到证书之后,还是像之前一样将中级 CA 拼接在证书后面,得到给 Nginx 使用的 domain-cert.crt

配置 Nginx

首先是将两个证书链都加入 Nginx 的配置文件:

如果要使用 CT 的话有两种方法:

1. 将两个证书的 CT 信息放到同一目录,并做如下设置:

这样 (更多…)