我想更改第一页(登录页面),在对其执行某些已定义的操作后,使用第二页(管理信息中心) 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>
非常欢迎任何替代方法。
答案 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';
}
});