2017-03-01 187 views
2

我试图创建一个具有用户输入他们的凭证,然后针对MySQL数据库检查登录环境JS((在适当的错误,如果错误的凭据返回)使用jQuery的阿贾克斯,并Perl的),经成功登录,将用户(用户门户显示动态页)传递JSON字符串的Perl CGI

我无法通过用户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 = '[email protected]'; 
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"; 

大多数的登录文件从IBM开发者页面修订于simple CGI user login page with mySQL

+1

没有人应该通过150(或不管它是什么)LOC试图帮助你。你能把我们的问题提炼成一个[mcve]吗? –

+0

我描述了我的问题在介绍中。我的代码在那里可以理解我迄今为止设置的内容。我想将用户传递给另一个页面。 – PrettyNeet

+2

如果您尝试过,您可以更简洁地重现问题。代码转储和为您调试代码的请求以及弄清楚什么是错误是懒惰的。 –

回答

-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"); 

这会在临时目录的本地饼干和阅读以找到我在login.pl页面上传递给它的“用户名”变量