Tomcat 开启 CGI 支持

Tomcat 主要充当 Servlet/JSP 容器,不过它却含有大量的功能可以与传统的 Web 服务器相媲美。例如,对公共网关接口(Common Gateway Interface,CGI)的支持就是其中之一。

传统的 Web 服务器为了响应浏览器的请求,提供了一种方式去运行外挂程序。该外挂程序常常用于处理基于 Web 的表单,而这种机制称为 CGI。

CGI 之所以称为通用,是因为它几乎可以调用所有编程或脚本语言,如:Perl、Python、awk、Unix shell 脚本,甚至还可以选择性地支持 Java。实际上,由于启动负荷过载,您可能不会将 Java 应用程序当成 CGI 来执行。而设计 Servlet 规范的起因就是为了消除这种系统负载过载。Servlet 几乎永远都比 CGI 高效,因为每次当有人点击链接或按钮时,并不会启动新的进程(进程开销很大)。

下面将介绍在 Tomcat 中怎样去开启 CGI 支持。Tomcat 默认包含了一个可选的 CGI Servlet,以用来执行遗留的 CGI 脚本。

开启 CGI 支持

默认情况下,Tomcat 并没有开启 CGI 支持,需要我们手动去开启 CGI 支持功能。开启步骤如下:

(1)编辑 %TOMCAT_HOME%confweb.xml 文件,去掉 cgi 的 <servlet> 注释,大约在 345 行。如下:

<!-- -->
<servlet>
    <servlet-name>cgi</servlet-name>
    <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>cgiPathPrefix</param-name>
      <param-value>WEB-INF/cgi</param-value>
    </init-param>
    <init-param>
        <param-name>executable</param-name>
        <param-value>D:ProgramFilesPython310python.exe</param-value>
    </init-param>
    <load-on-startup>5</load-on-startup>
</servlet>

常用的 CGI Servlet 初始化参数如下:

  • cgiPathPrefix:指定存放 CGI 脚本文件的目录,默认为 WEB-INFO/cgi

  • clientInputTimeout:放弃读文件输入之前所等待的时间,以毫秒为单位。默认值为 100

  • executable:执行执行 CGI 脚本的可执行程序,上面指定 python.exe 程序来执行 CGI 脚本

  • debug:调试登记,默认为 0

(2)编辑 %TOMCAT_HOME%confweb.xml 文件,去掉 cgi 的 <servlet-mapping> 注释,大约在 400 行。如下:

<!-- -->
<servlet-mapping>
    <servlet-name>cgi</servlet-name>
    <url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>

定义了 cgi Servlet 的访问地址映射,用户可以通过 http://localhost:8080/cgi-bin/**  方式访问。

(3)编辑 %TOMCAT_HOME%confcontext.xml 文件,在 <Context> 元素上添加 privileged="true" 属性。如下:

<!-- The contents of this file will be loaded for each web application -->
<Context privileged="true">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <!-- ... -->
</Context>

编写 CGI 脚本

这里将采用 Python 脚本作为 CGI 脚本,创建一个名为 demo.py 的 Python 脚本。内容如下:

#!/usr/bin/python

# CGI demo
print("content-type: text/html")
print("")

print("<html>")
print("<head>Welcome Tomcat CGI</head>")
print("<body>")
print("<h1>Welcome to the output of a CGI under Tomcat</h1>")
print("<p>The subject says all.</p>")
print("</body>")
print("</html>")

将保存好的 demo.py 文件拷贝到 %TOMCAT_HOME%webappsROOTWEB-INFcgi 目录,如下图:

注意:Python 版本信息如下:

Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32

访问 CGI 脚本

完成上面所有配置后,重新启动 tomcat,在浏览器访问 http://localhost:8080/cgi-bin/demo.py, 效果如下图:

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号