如何从同一个Express控制器脚本加载不同的html页面?

时间:2018-01-03 12:03:39

标签: javascript jquery node.js ajax express

我想更改第一页(登录页面),在对其执行某些已定义的操作后,使用第二页(管理信息中心) Express中的控制器。

这是我nimda.js的控制器代码:

function handlePut(req, res){
    let html = fs.readFileSync(path.join(__dirname,'../static/feed.html'));
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(html);
}

router.put('/', handlePut);

// This handles the form submitted.
router.post('/', function(req, res){
    if(req.body.pwd != '1234')
        res.send('False');
    else
        {
            //Doesn't work from here.
            handlePut(req, res);
        }
});

//This is when server.js routes the request to this script
router.get('/', function( req, res){
    let html = fs.readFileSync(path.join(__dirname,'../static/login_nimda.html'));
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(html);
});

我认为在身份验证后从我的POST代码执行PUT会帮助我发送一个新的HTML页面作为响应。第一个HTML页面是login_nimda.html,它向/nimda执行 POST 请求。 这不起作用,我保持相同的login_nimda.html。 POST请求可以正常工作。

以下是我login_nimda.html的脚本:

<script>
 $('#submit').on('click', function(){
        var form = $('#log').serialize();

        $.post('/nimda', form).done(function(data) {
                if(data=="False" && $('#err').length==0){
                    $('#log').prepend('<p id = "err" class = "alert alert-info" align = "centre" > Incorrect!</p>');
                }
                else
                {
                    $('#err').remove();
                    document.location.href = '/nimda/'+data;  
                }
        });
});
</script>

非常欢迎任何替代方法。

2 个答案:

答案 0 :(得分:3)

好的,所以我可以提出两种完全不安全的方法 -

<强> 1。将密码作为验证后的方法信息传递

login_nimda.html下的脚本被修改为向同一个控制器发送请求nimda.js

$.post('/nimda', form).done(function(data) {
    if (data == "False" && $('#err').length == 0) {
        $('#log').prepend('<p id = "err" class = "alert alert-info" align = "centre" > Incorrect!</p>');
    } else {
        $('#err').remove();
        document.location.href = '/nimda/'+$('input[type="password"]').val();  
    }
});

由于密码将仅在成功进行身份验证后出现在URL中,因此只有授权用户才能看到密码 - 下行:带有URL的密码被缓存

nimda.js已修改为加载&#34;第二页&#34;:

//the handler I added
router.get('/your_password', function(req, res){
    let html = fs.readFileSync(path.join(__dirname,'../static/second_page.html'));
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(html);
});

//for login authentication
router.post('/', function(req, res){
    if(req.body.pwd != '1234')
        res.send('False');
    else
        res.send('True');
});

<强> 2。在方法信息后认证中将随机字符串传递给控制器​​

嗯,我目前没有更好的选择

login_nimda.html下的脚本被修改为向同一个控制器nimda.js发送请求,但这次没有传递密码,而是在认证后作为访问密钥接收的随机字符串

<script>
 $('#submit').on('click', function(){
        var form = $('#log').serialize();

        $.post('/nimda', form).done(function(data) {
                if(data=="False" && $('#err').length==0){
                    $('#log').prepend('<p id = "err" class = "alert alert-info" align = "centre" > Incorrect!</p>');
                }
                else
                {
                    $('#err').remove();
                    document.location.href = '/nimda/'+data;  
                }
        });
});
</script>

nimda.js被修改为仅在身份验证成功时添加新路由处理程序,路由/nimda/new_random_string并且密钥(new_random_string)作为传递响应,以便控件移动到新处理程序以显示第二页:

var key = '';

function createRandomString( length ) {
    var str = "";
    for ( ; str.length < length; str += Math.random().toString( 36 ).substr( 2 ) );
    key = str.substr( 0, length );
    return key;
}

router.post('/', function(req, res){
    if(req.body.pwd != '1234')
        res.send('False');
    else
        {
            router.get('/'+ createRandomString(16), function(req, res){
            let html = fs.readFileSync(path.join(__dirname,'../static/feed.html'));
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end(html);
            });
            res.send(key);
        }
});

这样,密钥可以随着每个请求而改变,因此缓存变得无用。 请让我知道一个更好的解决方案。我知道有!

答案 1 :(得分:2)

当您使用JavaScript发送POST请求时,您处于浏览器(客户端)。浏览器将接收对该请求的响应,作为文本数据,包含HTML或服务器发送的任何内容。

如果作为对您在JavaScript中收到的数据的回复,您希望转移到另一个页面,则必须在JavaScript中执行此操作。

在JavaScript中,您将使用window.location

$.post('/nimda', form).done(function(data) {
    if (data == "False" && $('#err').length == 0) {
        $('#log').prepend('<p id = "err" class = "alert alert-info" align = "centre" > Incorrect!</p>');
    } else {
        $('#err').remove();
        document.location.href = '/some-page.html';  
    }
});