java - CGI 脚本错误 java RMI

标签 java webserver cgi rmi

我正在尝试为我的 RMI Web 服务器设置一个 cgi 脚本,但它始终给我一个 HTTP 500。

我的 CGI 脚本如下所示。

# This class will support a QUERY_STRING of the form "forward=<port>"
# with a REQUEST_METHOD "POST".  The body of the request will be
# forwarded (as another POST request) to the server listening on the
# specified port (must be >= 1024).  The response from this forwarded
# request will be the response to the original request.
#
# CONFIGURATION:
#
# Fill in correct absolute path to Java interpreter below.  For example,
# the "PATH=" line might be changed to the follow if the JDK is installed
# at the path "/home/peter/java":
#
# PATH=/home/peter/java/bin:$PATH
#
PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
exec java \
        -DAUTH_TYPE="$AUTH_TYPE" \
        -DCONTENT_LENGTH="$CONTENT_LENGTH" \
        -DCONTENT_TYPE="$CONTENT_TYPE" \
        -DGATEWAY_INTERFACE="$GATEWAY_INTERFACE" \
        -DHTTP_ACCEPT="$HTTP_ACCEPT" \
        -DPATH_INFO="$PATH_INFO" \
        -DPATH_TRANSLATED="$PATH_TRANSLATED" \
        -DQUERY_STRING="$QUERY_STRING" \
        -DREMOTE_ADDR="$REMOTE_ADDR" \
        -DREMOTE_HOST="$REMOTE_HOST" \
        -DREMOTE_IDENT="$REMOTE_IDENT" \
        -DREMOTE_USER="$REMOTE_USER" \
        -DREQUEST_METHOD="$REQUEST_METHOD" \
        -DSCRIPT_NAME="$SCRIPT_NAME" \
        -DSERVER_NAME="$SERVER_NAME" \
        -DSERVER_PORT="$SERVER_PORT" \
        -DSERVER_PROTOCOL="$SERVER_PROTOCOL" \
        -DSERVER_SOFTWARE="$SERVER_SOFTWARE" \
        sun.rmi.transport.proxy.CGIHandler

在我的 access.log 中显示:

"POST /cgi-bin/java-rmi.cgi?forward=1099 HTTP/1.1" 500 415 "-" "Java/1.7.0"

在我的 error.log 中它说:

(104)Connection reset by peer: ap_content_length_filter: apr_bucket_read() failed

我正在使用RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());强制 Http-to-cgi。

我不知道我做错了什么..

我已将 java-rmi.cgi 文件放入/usr/lib/cgi-bin/

我应该在脚本中添加其他内容吗?

我得到的java错误是:

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
    java.io.IOException: HTTP request failed

编辑:访问我的cgi脚本作为它给我的网站(也许你不能这样做):

Java RMI Client Error

invalid command.

我将其跟踪到 CGICommandHandler.java 中,当处理程序为 null 时,它返回无效命令。

这是我运行 bash -x 时的调试输出:

+ PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+ exec java -DAUTH_TYPE= -DCONTENT_LENGTH= -DCONTENT_TYPE= -DGATEWAY_INTERFACE= -DHTTP_ACCEPT= -DPATH_INFO= -DPATH_TRANSLATED= -DQUERY_STRING= -DREM                     OTE_ADDR= -DREMOTE_HOST= -DREMOTE_IDENT= -DREMOTE_USER= -DREQUEST_METHOD= -DSCRIPT_NAME= -DSERVER_NAME= -DSERVER_PORT= -DSERVER_PROTOCOL= -DSERVER_S                     OFTWARE= sun.rmi.transport.proxy.CGIHandler
Status: 400 Bad Request: invalid command.
Content-type: text/html

<HTML><HEAD><TITLE>Java RMI Client Error</TITLE></HEAD><BODY>
<H1>Java RMI Client Error</H1>

invalid command.
</BODY></HTML>

如果我回显我的 cgi i 文件,我会得到:

AUTH_TYPE= 
CONTENT_LENGTH= 
CONTENT_TYPE= 
GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 PATH_INFO= 
PATH_TRANSLATED= 
QUERY_STRING= 
REMOTE_ADDR=xx.xxx.x.xx 
REMOTE_HOST= 
REMOTE_IDENT=
REMOTE_IDENT REMOTE_USER= 
REQUEST_METHOD=GET SCRIPT_NAME=/cgi-bin/java-rmi.cgi.sh 
SERVER_NAME=xx.xxx.xxx.xxx
SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.1 
SERVER_SOFTWARE=Apache/2.2.22 (Ubuntu) Status: 400 Bad Request: invalid command. Content-type: text/html

正如你所看到的,我的许多字符串都是空的......

编辑2:现在我的访问日志给我带来了这个:

"POST http://xx.xxx.xxx.xxx/cgi-bin/java-rmi.cgi?forward=1099 HTTP/1.1" 500 415 "-" "Java/1.7.0"

仍然是 HTTP 500,我的错误日志给出的结果与以前相同..

编辑3:

我现在尝试实现 java-rmi.cgi 的 servlet,但它给了我错误。

我的 http.conf 看起来像这样:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>

端口和地址应该是什么?在指南中它说 localhost:8009( https://forums.oracle.com/message/4804030 )。

这是我放置 ServletHandler.class 的位置:

/var/lib/tomcat7/webapps/rmi/WEB_INF/classes

我的 web.xml(WEB_INF 内)如下所示:

<servlet>
<servlet-name>ServletHandler</servlet-name>
<servlet-class>ServletHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandler</servlet-name>
<url-pattern>/ServletHandler</url-pattern>
</servlet-mapping>

我已经正确安装了 tomcat 7。

我的访问日志给了我相同的信息,但我的错误日志现在给了我(在 httpd.conf 中设置了 localhost:8009):

[Fri Nov 15 08:16:26 2013] [error] [client 127.0.0.1] Invalid method in request \x124\x01\xb2\x02\x02
[Fri Nov 15 08:16:26 2013] [error] ajp_check_msg_header() got bad signature 3c21
[Fri Nov 15 08:16:26 2013] [error] ajp_ilink_receive() received bad header
[Fri Nov 15 08:16:26 2013] [error] ajp_read_header: ajp_ilink_receive failed
[Fri Nov 15 08:16:26 2013] [error] (120007)APR does not understand this error code: proxy: read response failed from (null) (localhost)

在http.conf中设置我的全局IP和端口80时的错误日志:

[Fri Nov 15 08:13:26 2013] [error] [client xx.xxx.xxx.xxx] Invalid method in request \x124\x01\xb2\x02\x02
[Fri Nov 15 08:13:26 2013] [error] ajp_check_msg_header() got bad signature 3c21
[Fri Nov 15 08:13:26 2013] [error] ajp_ilink_receive() received bad header
[Fri Nov 15 08:13:26 2013] [error] ajp_read_header: ajp_ilink_receive failed
[Fri Nov 15 08:13:26 2013] [error] (120007)APR does not understand this error code: proxy: read response failed from (null) (xx.xxx.xxx.xxx)

编辑4:

现在看起来像这样:

web.xml:

  <servlet>
    <servlet-name>ServletHandler</servlet-name>
    <servlet-class>rmiservlethandler.ServletHandler</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>ServletHandler</servlet-name>
    <url-pattern>/ServletHandler</url-pattern>
    </servlet-mapping>

httpd.conf:

 LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
    LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

    <Location /cgi-bin/java-rmi.cgi>
    ProxyPass ajp://xx.xxx.xxx.xxx:8009/rmi/ServletHandler
    </Location>

我尝试了 localhost:8009 但这给了我错误,输入我的服务器全局地址使我的网络服务器停止,HTTP 503。停止响应。

我的本​​地主机错误日志:

[Fri Nov 15 12:20:53 2013] [error] (111)Connection refused: proxy: AJP: attempt to connect to 127.0.0.1:8009 (localhost) failed
[Fri Nov 15 12:20:53 2013] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Fri Nov 15 12:20:53 2013] [error] proxy: AJP: failed to make connection to backend: localhost

全局IP错误日志:

[Fri Nov 15 12:37:23 2013] [error] (110)Connection timed out: proxy: AJP: attempt to connect to xx.xxx.xxx.xxx:8009 (xx.xxx.xxx.xxx) failed
[Fri Nov 15 12:37:23 2013] [error] ap_proxy_connect_backend disabling worker for (xx.xxx.xxx.xxx)
[Fri Nov 15 12:37:23 2013] [error] proxy: AJP: failed to make connection to backend: xx.xxx.xxx.xxx

Tomcatlog 给了我这个:

My tomcatlog gives me this: 
xx.xxx.x.xx - - [15/Nov/2013:13:32:14 +0000] "POST /rmi/ServletHandler?forward=1099 HTTP/1.1" 404 987

编辑 5。

没用,我得到/rmi/ServletHandler 的 404。

这是我的httpd.conf(去掉.cgi):

<Location /cgi-bin/java-rmi> ProxyPass ajp://localhost:8009/rmi/ServletHandler </Location>

这是 web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> 
<servlet-name>ServletHandler</servlet-name> 
<servlet-class>rmiservlethandler.ServletHandler</servlet-class> 
<load-on-startup>1</load-on-startup> </servlet> 
<servlet-mapping> <servlet-name>ServletHandler</servlet-name> 
<url-pattern>/ServletHandler</url-pattern> 
</servlet-mapping> 
</web-app>

文件夹设置现在是:

/var/lib/tomcat7/webapps/rmi/WEB_INF。

WEB_INF包含web.xml和classes/rmiservlethandler/,其中rmiservlethandler是我所有类文件所在的位置(包结构)。

为什么这不起作用?

我的/usr/lib/cgi-bin/是空的,这应该是对的吗?

我的 servlet 没有运行... 谢谢!

最佳答案

解决了!

我的文件夹设置是正确的(除了 WEB-INF 而不是 WEB_INF),问题是 ServletHandler 中的本地主机地址未正确解析(我的本地主机名称不是本地主机..)。 其他像 WEB_INF 应该是 WEB-INF...

接下来,我在 tomcat catalina.out 和本地主机日志文件中出现了异常。 因此,如果您认为您的 servlet 运行正常,请查找异常情况。我用日志修改了 ServletHandler,这样我就可以看到正在发生的一切。

这是我从客户端发出的 POST 现在在 tomcat 日志中看到的内容:

xx.xxx.x.xx - - [18/Nov/2013:13:17:23 +0000] "POST /rmi/ServletHandler?forward=1099 HTTP/1.1" 200 1

我的http.conf:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>

我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>ServletHandler</servlet-name>
<servlet-class>com.foo.bl.server.ServletHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandler</servlet-name>
<url-pattern>/ServletHandler</url-pattern>
</servlet-mapping>
</web-app>

文件夹结构:

/var/lib/tomcat7/webapps/rmi/WEB-INF/classes/

在类内部,您可以放置​​与 Java IDE 中相同的文件夹结构。 Web.xml 应放置在 WEB-INF 内。

任何需要的lib文件都应该放在WEB-INF/lib中。

希望它可以帮助那里的人!

问候古斯塔夫

关于java - CGI 脚本错误 java RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956979/

相关文章:

java - OnClickListener的不同实现方式

Javascript 可以在本地运行,但不能在带有 NiceEdit 的服务器上运行

python - 有没有一种简单的方法可以从 Python CGI 脚本启动后台任务而无需等待它终止?

java - 我可以为Java中的目录指定 "base package path"吗?

java - 从 Java 中的字符串中删除非 ASCII 字符

reactjs - React 网站子文件夹中的 "404 Not Found"

c# - 从外部 LAN raspberry pi 3 windowsiot 连接到网络服务器

perl - 如何为基本的 http 身份验证设置用户名和密码?

Python Cgi 编程权限

java - BlazeDS : what ARE those standard security fault codes?