用 tomcat 将文件部署在本地服务器上

警告
本文最后更新于 2020-03-14,文中内容可能已过时。

在学习 ajax 的过程中,学习了一个例子,其中代码如下:

function updateDisplay(verse) {
  verse = verse.replace(" ", "");
  verse = verse.toLowerCase();
  let url = verse + ".txt";
  let request = new XMLHttpRequest();
  request.open("GET", url);
  request.responseType = "text";
  request.onload = function () {
    poemDisplay.textContent = request.response;
  };
  request.send();
}

但是按照以往直接打开的做法,浏览器控制台出现如下错误

from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

因为是从本地文件运行示例的,一些浏览器(包括 Chrome)不会运行异步请求,这是因为安全限制。(了解详情可参考:https://developer.mozilla.org/zh-CN/docs/learn/Server-side/First_steps/Website_security)

为了解决这个问题,经过多方搜索,我参考了 https://blog.csdn.net/saber872138/article/details/82995238 答案中的解决方法一,即利用 tomcat 解决。 按照 https://how2j.cn/k/tomcat/tomcat-tutorial/541.html 的介绍 首先安装 java 环境,在官网 https://www.oracle.com/java/technologies/javase-downloads.html 中选择要安装的版本,我选择的 JDK 是 Java SE 8u241,这时 Java SE 11 (LTS)是最新最稳定的版本,我先安装了这个版本,安装完之后,找不到 jre 文件,对于我这个搞不懂 jre 和 jdk 到底是啥的菜鸟来说,这两个在我印象中是缺一不可的,因为后面还有一项配置环境变量需要 jre 的所在目录,于是我把 Java SE 11 (LTS)卸载了,重新安装了 Java SE 8u241,也是我之前一直在用着的版本。这个安装文件包括了 jre 的安装,安装成功后就是设置环境变量,如下

变量名变量值
JAVA_HOMED:\Program Files (x86)\Java\jdk1.8.0_241
CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
Path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

设置并保存,在命令行输入“java -version”,得出结果表示 java 环境已搭建好,接下来就要搞定 tomcat 了。

tomcat 是在官网 https://tomcat.apache.org/ 下载的压缩包,我下载的版本号是 9.0.31,直接将压缩包解压到特定文件下就行,然后打开根目录下的 bin 文件夹,找到 start.bat 并执行,刚开始启动 tomcat 的窗口出现乱码,

14-Mar-2020 20:23:03.593 淇℃伅 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\Program Files\apache-tomcat-9.0.31\webapps\host-manager] has finished in [65] ms
14-Mar-2020 20:23:03.594 淇℃伅 [main] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲 鍒扮洰褰?[D:\Program Files\apache-tomcat-9.0.31\webapps\manager]

14-Mar-2020 20:23:03.644 淇℃伅 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\Program Files\apache-tomcat-9.0.31\webapps\manager] has finished in [51] ms
14-Mar-2020 20:23:03.645 淇℃伅 [main] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲 鍒扮洰褰?[D:\Program Files\apache-tomcat-9.0.31\webapps\ROOT]

14-Mar-2020 20:23:03.690 淇℃伅 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\Program Files\apache-tomcat-9.0.31\webapps\ROOT] has finished in [44] ms
14-Mar-2020 20:23:03.696 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start 寮€濮嬪崗璁鐞嗗彞鏌刐"http-nio-8080"]
14-Mar-2020 20:23:03.717 淇℃伅 [main] org.apache.catalina.startup.Catalina.start Server startup in [1,273] milliseconds

我查了一下并且在这个 https://blog.csdn.net/weixin_39513118/article/details/86352063 回答下找到了答案,即修改 tomcat 的 conf 下的 logging.properties 中的参数,将 UTF-8 改为 GBK 即可。

java.util.logging.ConsoleHandler.encoding = GBK

将跨域出现问题的代码放在 tomcat 下的 webapps/ROOT 下,例如我放在 D:\Program Files\apache-tomcat-9.0.31\webapps\ROOT\page\api ,然后启动 tomcat,在浏览器上输入 http://localhost:8080/page/api/ajax-start.html 就能访问到该页面。 如果想更加全面了解 tomcat,接下来要花一段时间看看 https://how2j.cn/k/tomcat/tomcat-tutorial/541.html

根据 MDN 的这篇文章 https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/set_up_a_local_testing_server 可以知道,原来用 python 也可以,我决定试一试。