【问题标题】:Passing JSON string to Perl CGI将 JSON 字符串传递给 Perl CGI
【发布时间】:2017-03-01 23:28:32
【问题描述】:

我正在尝试创建一个让用户输入其凭据的登录环境,然后使用 JS(使用 jqueryajaxPerl),在成功登录后,将为用户显示一个动态页面(用户门户)

我无法将用户 ID 传递到最后一个 cgi 页面。

以下是我的代码:

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>login</title>
    <link rel="stylesheet" type="text/css" media="screen, projection" href="http://www.blueprintcss.org/blueprint/screen.css" />
    <link rel="stylesheet"  type="text/css" media="screen, projection" href="http://www.blueprintcss.org/blueprint/plugins/buttons/screen.css" />
    <link rel="stylesheet" type="text/css" media="print" href="http://www.blueprintcss.org/blueprint/print.css" />
    <!--[if IE]><link rel="stylesheet" type="text/css" media="screen, projection" 
        href="http://www.blueprintcss.org/blueprint/ie.css"><![endif]-->
    <script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="login.js"></script>
    <style type="text/css">
    #loginContent { width: 350px; margin: 100px auto; }
    button[type] { margin: 0.5em 0; }
    #loginForm{
        width:25%;
        padding: 5px 5px;
        margin:auto;
    }
    </style>
</head>
<body>
    <h2>Please have pop-ups enabled for this site</h2>
    <div id="loginResult" style="display:none;"></div>
    <form id="loginForm" name="loginForm" method="post" action="">
        <fieldset>
        <legend>Enter Information</legend>
            <p>
                <label for="username">Username</label>
                <br />
                <input type="text" id="username" name="username" class="text" size="20" />
            </p>
            <p>
                <label for="password">Password</label>
                <br />
                <input type="password" id="password" name="password" class="text" size="20" />
            </p>
            <p>
                <button type="submit" class="button positive">Login</button>
            </p>
        </fieldset>
    </form>
</body>
</html>

login.js

$(document).ready(function(){
$("form#loginForm").submit(function() { // loginForm is submitted
var username = document.getElementById("username").value; //$('#username').attr('value'); // get username
var password = document.getElementById("password").value; //$('#password').attr('value'); // get password

if (username && password) { // values are not empty
  $.ajax({
    type: "GET",
    url: "/cgi-bin/login.pl", // URL of the Perl script
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    // send username and password as parameters to the Perl script
    data: "username=" + username + "&password=" + password,
    // script call was *not* successful
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
      $('div#loginResult').text("responseText: " + XMLHttpRequest.responseText 
        + ", textStatus: " + textStatus 
        + ", errorThrown: " + errorThrown);
      $('div#loginResult').addClass("error");
    }, // error 
    // script call was successful 
    // data contains the JSON values returned by the Perl script
    success: function(data){
      if (data.error) { // script returned error
        $('div#loginResult').text("data.error: " + data.error);
        $('div#loginResult').addClass("error");
      } // if
      else { // login was successful
        $('form#loginForm').hide();
        $('div#loginResult').text("data.success: " + data.success 
          + ", data.userid: " + data.userid);
        $('div#loginResult').addClass("success");
        window.open("/cgi-bin/portal.pl");
      } //else
    } // success
  }); // ajax
} // if
else {
  $('div#loginResult').text("enter username and password");
  $('div#loginResult').addClass("error");
} // else
$('div#loginResult').fadeIn();
return false;
});
});

login.pl

#!C:\Strawberry\perl\bin\perl.exe
use CGI;
use DBI;
use strict;
use warnings;

# read the CGI params
my $cgi = CGI->new;
my $username = $cgi->param("username");
my $password = $cgi->param("password");

# connect to the database
my $db = 'bakery_users';
my $host = 'localhost';
my $user = 'root';
my $pass = 'P@ssw0rd';
my $dbh   = DBI->connect ("DBI:mysql:database=$db:host=$host", $user, $pass) or die "Can't connect to database: $DBI::errstr\n";
# check the username and password in the database
my $statement = qq{SELECT id FROM users WHERE username=? and password=?};
my $sth = $dbh->prepare($statement)
  or die $dbh->errstr;
$sth->execute($username, $password)
  or die $sth->errstr;
my ($userID) = $sth->fetchrow_array;

# create a JSON string according to the database result
my $json = ($userID) ? 
  qq{{"success" : "login is successful", "userid" : "$userID"}} : 
  qq{{"error" : "username or password is wrong"}};

# return JSON string
print $cgi->header(-type => "application/json", -charset => "utf-8");
print $json;

这是垃圾门户 cgi 页面,需要了解用户,以便我可以提供一些特定信息

#!C:\Strawberry\perl\bin\perl.exe
use CGI;
use strict;
use warnings;

my $cgi = CGI->new; #new CGI routine

print $cgi->header('text/html'); #create HTTP header

print "<html> <head>\n";
print "<title>Hello, world!</title>";
print "</head>\n";
print "<body>\n";
print "<h1>Hello, world!</h1>\n";
print "</body> </html>\n";

大部分登录文件都是从simple CGI user login page with mySQL 上的 IBM 开发人员页面修改的

【问题讨论】:

  • 没有人应该通过 150(或任何其他)LOC 来尝试帮助您。您能为我们提炼问题到minimal reproducible example 吗?
  • 我在介绍中描述了我的问题。我的代码在那里可以理解我到目前为止设置的内容。我想将用户传递到另一个页面。
  • 如果您尝试过,当然可以更简洁地重现该问题。代码转储和为您调试代码并找出问题所在的请求是懒惰的。
  • @Matt Jacob,每个文件都非常简单,并且没有太多可以从其中删除的内容。与他们合作应该没有问题。
  • 当前代码有效,我只需要将 UserID 传递给他们打开的新页面

标签: javascript jquery mysql json perl


【解决方案1】:

我能够通过另一个 Perl 模块 CGI:Session 传递 CGI 参数。

通过添加

my $session = new CGI::Session(undef, undef) or die CGI::Session->errstr;
$session->param("username", $username);
my $cookie = $cgi->cookie(CGISESSID => $session->id);
print $cgi->header( -cookie=>$cookie );

到我的 login.pl 文件并将以下块添加到我的 portal.cgi

my $sid = $cgi->cookie('CGISESSID') || $cgi->param('CGISESSID') || undef; #loads previous cookie
my $session = load CGI::Session(undef, $sid);
my $user = $session->param("username");

这会在临时目录中创建一个本地 cookie,并读取它以查找我在 login.pl 页面上传递给它的“用户名”变量

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2017-01-22
    • 2018-11-25
    • 1970-01-01
    • 2014-09-04
    • 2020-05-13
    • 2017-02-19
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多