在Perl CGI中正确编程/从不同的perl cgi文件访问相同的数据

时间:2011-02-11 00:44:45

标签: html perl cgi

我是Perl CGI编程的新手,并且有一些问题。目前我有1个HTML页面和一堆perl页面。用户从HTML页面开始输入他们的姓名和地址。然后,此表单调用Perl CGI文件。现在,当这个Perl文件执行时,它会生成一些用户将看到另一个页面的HTML。现在在perl文件生成的HTML中,还有另一个调用另一个CGI脚本的表单。这样继续下去,我基本上每个页面都有一个Perl CGI文件。

这是使用CGI做事的正确方法吗?

我遇到的问题是我不知道如何在所有这些perl文件之间共享信息,因为它们只是通过表单的操作相互通信。

我有一个小型购物车,因此需要能够从多个页面初始化,获取和设置它的内容。

如上所述,如何在文件之间共享数据?

2 个答案:

答案 0 :(得分:7)

要重新思考Sinan所说的内容,购物车需要使用会话来完成。

我会尝试更多地解释这一切是如何运作的,因为你的问题似乎意味着你想了解细节。


涉及两个概念:会话Cookie和服务器端的会话数据库。

您的Web服务器有一个内部“会话”数据库 - 它基本上是一个称为“会话密钥”的长字符串和一组数据之间的映射。此数据库可以内置到Web服务器中,或者在Perl CGI的情况下,可以由特殊的Perl模块实现。

会话数据库中存储在此blob数据中的内容是什么?您的CGI脚本决定存储的任何内容 - 在您的情况下,是购物车的当前状态。

如何在页面之间共享信息?会话模块生成一个特殊的“Session Cookie”,其中cookie的值与用于在会话数据库中的服务器上存储数据blob的“会话密钥”相同。然后由用户的浏览器存储,就像所有其他cookie一样,除了它的值仅在“会话期间”有效 - 它会在短时间后过期或者您关闭浏览器。然后,当用户继续使用Web应用程序时,cookie值将被发送回服务器,因此您的CGI脚本知道重新使用该会话密钥。

注意:另一种方法(而不是使用Cookie)是在所有请求之间传递会话ID值(例如,将其编码为所有GET URL和POST表单)。


就Perl CGI实现而言,它取决于您使用的特定Perl Web框架 - 基本会话工作可以使用CGI::Session CPAN模块完成(有good tutorial for it as well)。使用Apache Web服务器的人的另一个常用选项是Apache::Session

一般会话相关模块的功能是为您提供以下API:

  • 管理会话数据库
  • 使用会话密钥(即会话ID)
  • 在会话数据库中存储/检索数据
  • 获取用户当前的会话ID(来自会话cookie值),如果有的话
  • 如果需要,为用户生成新的会话ID
  • 将会话ID值作为cookie发送,以存储在对用户浏览器的HTTP响应中。

任何体面的Perl Web框架都内置了会话功能(它们仍然使用某种Session管理Perl模块实现,但该框架提供了易于使用的API。

作为“易于使用”的示例,在Embperl中,要在会话中存储值,您只需$udat{shopping_cart} = \%shopping_cart_data并检索它%shopping_cart_data = %$udat{shopping_cart} - %udat是一个特殊的哈希名称)。而已。框架隐藏了所有细节。


<强>更新

这与我所看到的实际问题几乎没有任何关系,但这是一个有效的观点,对这个答案的评论让我想到了。

为了提高代码的整体质量,您应该总是抽象出一般的业务逻辑。在这种情况下,如果您有任何通用逻辑来处理在不同的Perl CGI脚本之间共享的购物车数据,那么该逻辑应该被抽象为一个单独的Perl模块。

此外,作为进一步的改进:

  • 您应该考虑任何复杂的Web应用程序的MVC(模型 - 视图 - 控制器)设计。为了使这更容易,选择一个符合MVC标准的Perl Web框架(我认为Catalyst现在被认为是主要的选择,但在设置之前进行自己的研究。

  • 您还应该有一个允许您模块化和重复使用Web(视图)元素的设计 - 例如可能会显示购物车中的项目数量的应用程序的顶部变量将始终是几乎相同的HTML,并且您不应该跨不同视图复制该HTML。 (如果您不确定我在说什么,请查看亚马逊网页上的前2行)。有不同的技术可以实现这一点,这远远超出了你的问题范围(框架,带有合并视图的Web框架,用于View打印的Perl模块等)。

答案 1 :(得分:5)

简短的回答是:你做错了。

您需要使用服务器端会话在服务器端为每位访问者存储购物车的内容。

例如,请My Experiences with using CGI::Application and Template::Toolkit To Build an Online Shopping Cart查看Justin Simoni

如果您尝试将购物车的内容存储在您所服务的HTML页面中,恶意访问者可以轻松更改价格,并为人们在九十年代中期发现的折扣提供良好的折扣。