远程编辑cgi

不得不说,好多时间都浪费这了,MD最主要的还是浪费在tomcat运行cgi的404错误这,一打开http://localhost:8080/cgi-bin/xx.cgi就发生404错误,虽然百度下404错误知道是个路径错误,但我这超菜鸟级别的还是犹如海底捞针,不知道从哪改。尤其是在昨天,cgi可以运行了,html表单运行不了,出来就是个空白,最后发现还是路径错误。。。

第一个问题就是运行cgi的配置,总的来说百度下就知道了。


先看index.html的代码:

<html>
        <head>
                <title>File Editor</title>
        </head>
        <body>
                <form action='/cgi-bin/edit.cgi' method='POST'>
                        <b>File name:</b><br/>
                        <input type='text' name='filename'/>
                        <input type='submit' value='Open'/>
                </form>
        </body>
</html>
其中tomcat的默认路径是 \ROOT ,而我把Index.html放到了/ROOT/WEB-INF/cgi/ 目录中,这就是造成空白的原因,造成空白而不产生404错误,这说明可以访问到index.html文件,路径里有这个文件,但是不能解析index.html文件,导致于空白,后来我把index.html直接放到\ROOT目录下,发现可以访问并解析。而cgi机制在web.xml里的默认路径是/ROOT/WEB-INF/cgi/,而且要访问cgi文件,必须在url中输入/cgi-bin/xx.cgi,因为在cgi映射中是这样规定的。所以我觉得/ROOT/WEB-INF/cgi/目录中的不能运行html文件的,可以直接放到默认的ROOT根目录下。

iindex.html大概的意思是:页面生成一个File Editor标题,主题内容是File name:,然后一个空白标号,下面是一个需要输入名字的文本框,接着是一个用以实现提交功能的’Open‘按钮,并且把输入都提交给要跳转的页面,而action='/cgi-bin/edit.cgi'则就是将要跳转的页面。

下面看看跳转的页面edit.cgi代码:

print 'Content-type: text/html\n'

from os.path import join, abspath
import cgi,sys

BASE_DIR = abspath('data')

form = cgi.FieldStorage()
filename = form.getvalue('filename')
if not filename:
        print 'Please enter a file name'
        sys.exit()

try:
        text = open(join(BASE_DIR,filename)).read()
except Exception,data:
        print str(data)


print """
<html>
 <head>
  <title>Editing...</title>
 </head>
 <body>
 <form action='/cgi-bin/save.cgi' method='POST'>
 <b>File:</b>%s<br/>
 <input type='hidden' value='%s' name='filename'/>
 <b>Password:</b><br/>
 <input name='password' type='password' /><br/>
 <b>Text:</b><br/>
 <textarea name='text' cols='40' rows='20'>%s</textarea><br/>
 <input type='submit' value='Save' />
 </form>
 </body>
 </html>
 """ % (filename, filename, text)
这个跳转页面也遇到了一个问题,当我测试cgi文件能不能运行时,就打开了http://localhost:8080/cgi-bin/edit.cgi,我发现只会输出一条 ’Please Enter a file name',理所当然,因为我就没有输入文件名。但是当我从index.html表单跳转到edit.cgi页面时就出现了404,原因就是我原先的index.html中的action赋值为‘edit.cgi’,路径不对,计算机找不到对应的文件,后来想到cgi文件必须经过/cgi-bin/xx.cgi来访问,所以修改后就可以跳转了。并且你要打开的文件一定存在,而且还有路径要求,比如我建一个空白test.txt文档,放在

/ROOT/WEB-INF/cgi/data/目录下,就是在cgi文件夹下再建一个data文件夹,然后放里面即可。

edit.cgi的大概意思是:cgi.FiledStorange()是获取表单的参数(这是是网上查到的),下面紧接着就是获取文件名了,然后确定你输入的文件名是否为空,为空则打印‘PleaseEnter a file name’,并且退出程序。下面就是一个捕捉异常的代码,意思是打开data中你所输入的文件名,但是如果data中根本没有你所输入的文件名(打开一个文件夹中不存在的文件),就会引发异常,打印 一条 说没有该文件的字符串。如果有那就是打开了。接着下面就又是一些html代码了,和index.html中功能差不多,不一样的就是

<input type='hidden' value='%s' name='filename'/>是表示一个隐藏域,我不知道隐藏这个干什么,然后就是生成一个密码框,他和文本框不同之处输入的都是隐藏的,接下来就是一个高宽40*20像素的文本框 了,最后也是一个实现提交功能的按钮‘save’,用来跳转到save.cgi

接下来看save.cgi代码:

print 'Content-type: text/html\n'

from os.path import join, abspath
import cgi, sha, sys

BASE_DIR = abspath('data')

form = cgi.FieldStorage()

text = form.getvalue('text')
filename = form.getvalue('filename')
password = form.getvalue('password')

if not (filename and text and password):
        print 'Invalid parameters'
        sys.exit()

if sha.sha(password).hexdigest() != '8843d7f92416211de9ebb963ff4ce28125932878':
        print 'Invalid password'
        sys.exit()

f = open(join(BASE_DIR,filename), 'w')
f.write(text)
f.close()

print 'The file has been saved.'

现在我知道那个<input type='hidden' value='%s' name='filename'/>是用来隐藏的意思了,隐藏文件名是用来传给save.cgi。

save.cgi代码的大概意思是:获取上页面传来的文件名和密码,还多一个获取上页面输入的文本内容(text = form.getvalue('text')),然后判断你输入的文件名或密码或内容是否为空,为空则打印 ‘Invalid parameters’,无效的参数。且推出程序。还有就是如果你输入的密码不对(这是事先经过sha函数生成的信息摘要),则打印‘Invalid password’,无效的密码。
最后如果密码对了,就打开data中且与你输入一致的文件名,并且往此文件中写入text传过来的内容,关闭文件,打印  'The file has been saved.',文件被存储了。

最后上图:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值