升级博客网站遇到的坑

2020-01-03   阅读(74)  

今天下班,为了解决 2 个问题,升级自己的博客网站:

  • Java 面试题的页面静态化
  • 使用 HttpServletResponse 直接输出 markdown 格式的文本

 

坑 1:

先说一下,我做页面静态化的思路:

  • 通过 Controller 的动作返回 jsp 页面
  • 传不同的 id 就能查看不同面试题的页面
  • 控制台点击生成静态页面按钮,服务器上 web 应用请求自己的 Controller ,获取 html 内容,写入文件到 nginx 静态文件目录

服务器上的 web 容器用的是 tomcat 8

 

我在本地代码提交和测试好了,以为在服务器执行一下更新部署的脚本,结果开心的事情发生了:静态页面没有生成出来。

看了一眼日志:

Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

 

这一看就知道是参数出问题了,网上查解决办法:意思都是说 GET 请求不支持 RFC 7230 and RFC 3986 规定外的字符,但是解决办法都不靠谱。

既然是参数问题,就想到了对参数进行编码:

URLEncoder.encode(typeIdAndName, "utf-8")

 

把 tomcat 的 server.xml 的字符集改成 utf-8,猜想 tomcat 肯定会自行解码参数,并没有对 controller 的参数进行解码,测一下成功了。

这个问题花了我不少时间排查,因为我本地用的 tomcat7 并不存在这个问题,所以被坑得血淋淋的。

 

Request For Comments(RFC),是一系列以编号排定的文件。RFC 文件是由 Internet Society(ISOC)赞助发行。几乎所有的互联网通信协议都有在RFC文件内详细说明。

附上 RFC 7230 and RFC 3986 源文件,有兴趣可以研究一下:

 

 

坑 2:

Controller 使用 HttpServletResponse 直接输出 markdown 格式的文本中包含中文乱码

因为文章的中文并无乱码,所以猜想肯定是浏览器解析和显示的问题,于是给 HttpServletResponse 设置好 ContentType 应该就好了

resp.setContentType("application/json;charset=UTF-8");

 

 


 

问题搞完,已经 23 点多,公司只有我一个人了,真没想到还会出这幺蛾子,酸爽......

 

ConstXiong 备案号:苏ICP备16009629号-3