唐磊的个人博客

Tomcat配置CGI实例

腾讯实习的培训布置的作用中需要用Qzhttp+FastCGI+TTC架构写demo.网上参照了下,最后成功在Tomcat下配置CGI并实现简单例子.

Tomcat提供了对CGI的支持,但默认情况下,Tomcat对CGI的支持被禁止了。开启支持要采取如下配置:

将文件 $CATALINA_BASE/server/lib/servlets-cgi.renametojar 的名称修改为$CATALINA_BASE/server/lib/servlets-cgi.jar。有的还说要将此目录下servlets-ssi.renametojar改成servlets-ssi.jar. 如果想让Tomcat下所有的Application支持支持CGI,可以修改 $CATALINA_BASE/conf/web.xml;如果只希望某些Application支持CGI,那么只需要修改这些应用root目录下的/WEB-INF/web.xml文件。

使用batch命令编写CGI脚本,可以将以下几行配置代码添加到web.xml就可完成对web.xml文件的修改(具体见下):其中的参数: 配置CGI servlet的行为,涉及到以下几个servlet的初始化参数。

cgiPathPrefix – CGI程序所在的目录,CGI servlet将按照以下路径搜索CGI程序:应用程序root目录 + 路径分割符 + cgiPathPrefix。其默认值为 WEB-INF/cgi。CGI程序应该放在WEB-INF下面的目录以防止程序被当作普通文件被下载或其脚本内容被查看。

debug – 设置servlet在日志中记录调试信息的级别,其值越大,信息越详细。默认值为0。

executable – 用来运行脚本的可执行程序,默认为perl。

parameterEncoding – CGI servlet使用的编码类型名称。默认值取 System.getProperty(“file.encoding”,”UTF-8″)。

passShellEnvironment – 是否将shell的环境变量传递给CGI脚本。默认值为false。

举例:

myeclipse新建一个web项目。web.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- CGI servlet configuration -->
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name />
debug</param-name>
<param-value />
100</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 />
cmd.exe /c</param-value>
</init-param>
<init-param>
<param-name />
passShellEnvironment</param-name>
<param-value />
true</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<!-- CGI servlet mapping -->
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
</web-app>

然后构造如下目录:TOMCAT配置CGI目录结构

注意结构,web-inf下面有个CGI,在web.xml配置的目录结构,当然也可以改相应的配置文件与目录结构对应即可。

其中test.bat

echo OFF
echo Content-type: text/html
echo.
echo.
echo ^
echo ^
echo ^CGI Test Demo^
echo ^Time is:
time /t
echo ^
echo ^Location is:
chdir
echo ^
echo ^
echo ^

启动tomcat,然后浏览器访问:http://localhost/cgiDemo/cgi-bin/test.bat 看到如下图说明配置成功了

TOmcat配置CGI

再写个C语言的程序:add.cpp

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *data;
long m,n;
printf("%s","Content-Type:text/html;charset=gb2312\n\n");
printf(" <TITLE> 乘法结果 </TITLE> ");
printf(" <H3> 乘法结果 </H3> ");
data = getenv("QUERY_STRING");
if(data == NULL)
printf(" <P> 错误!数据没有被输入或者数据传输有问题");
//sscanf 类似正则表达式 以固定的格式为输入源,而scanf从标准输入获得输入源
//成功则返回参数数目
else if( sscanf(data,"m=%ld&n=%ld",&m,&n) != 2)
printf(" <P> 错误!输入数据非法。表单中输入的必须是数字。");
else
printf(" <P> %ld * %ld = %ld。<br />",m,n,m*n);
return 0;
}

编译连接成可执行文件。在上图中已经显示出来。

有个html的表单:

<FORM ACTION="cgi-bin/add.exe" method="get">
<P>
请在下面填入乘数和被乘数,按下确定后可以看到结果。
<INPUT NAME="m" SIZE="5" />
<INPUT NAME="n" SIZE="5" />
</P></BR>
<INPUT TYPE="SUBMIT" VALUE="确定" />
</form>
<p>
  我的首页是为了测get post两种情况写的代码如下:
</p>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%=basePath%>
<center>
get:
</center>
<hr size="4" color="red" />
<center>
post 得通过另外的方式才行 先得到Content-length:
</center>
<hr size="4" color="red" />
<center>
<FORM ACTION="cgi-bin/add.exe" method="get">
<P>
请在下面填入乘数和被乘数,按下确定后可以看到结果。
<INPUT NAME="m" SIZE="5" />
<INPUT NAME="n" SIZE="5" />
</P></BR>
<INPUT TYPE="SUBMIT" VALUE="确定" />
<center>
</FORM >
</body>
</html>
<p>
  效果:
</p>


<p>
  <a href="/wp-content/uploads/2011/07/tomcat-config-cgi-run-cpp.jpg"><img class="aligncenter size-medium wp-image-1027" title="tomcat-config-cgi-run-cpp" src="/wp-content/uploads/2011/07/tomcat-config-cgi-run-cpp.jpg" alt="Tomcat配置CGI运行C程序"  data-pinit="registered" /></a>

</p>


<p>
  输入数据结果现实:<br />
  <a href="/wp-content/uploads/2011/07/tomcat-cgi-cpp-result.jpg"><img class="aligncenter size-medium wp-image-1028" title="tomcat-cgi-cpp-result" src="/wp-content/uploads/2011/07/tomcat-cgi-cpp-result.jpg" alt="Tomcat配置CGI运行Exe文件"   data-pinit="registered" /></a>
</p>


<p>
  差不多了。现在我又有一种方法通过java等运行C可执行文件了。之前用<a href="/blog/java-native-demo.html">native也写过helloworld的例子</a>。
</p>
tanglei wechat
欢迎扫描二维码关注我的微信公众号