Thật ra đoạn kịch bản dưới đây cũng không có gì là mới mẻ, nhưng mình nghĩ sẽ có một số bạn đến nó.
Cập nhật
16:15 25/01/2016
Giới thiệu
Sử dụng xhr để gửi yêu cầu đăng nhập tới máy chủ. Nó giúp tiết kiệm băng thông, dữ liệu và thời gian tải trang vì nhận thông tin qua xhr.
Lời khuyên
Nên sử dụng cho các ứng dụng đăng nhập nhanh (dạng thẻ nhỏ). Ví dụ: diễn đàn devs.
Hạn chế
Mã nguồn diễn đàn không hỗ trợ API nên việc này mình phải sử lí thủ công.
Mình chưa tìm cách đăng nhập rõ nguyên lí nên việc đăng nhập chỉ có thể sử dụng ở trang người dùng (blank page) hoặc trên chính diễn đàn cần đăng nhập.
Lưu ý
Phần kiểm tra trước khi gửi yêu cầu, vì mình không biết cách giới hạn tên người dùng và mật khẩu nên mình để tạm như vậy, khi bạn bạn nào gé qua góp ý cho mình sửa.
Kịch bản
Sử dụng
Ứng dụng
Mình đã thử chạy trên diễn đàn Devs và một số diễn đàn khác, đã thành công.
Nếu gặp vấn đề về kịch bản, vui lòng để lại lời nhắn.
Cập nhật
16:15 25/01/2016
Giới thiệu
Sử dụng xhr để gửi yêu cầu đăng nhập tới máy chủ. Nó giúp tiết kiệm băng thông, dữ liệu và thời gian tải trang vì nhận thông tin qua xhr.
Lời khuyên
Nên sử dụng cho các ứng dụng đăng nhập nhanh (dạng thẻ nhỏ). Ví dụ: diễn đàn devs.
Hạn chế
Mã nguồn diễn đàn không hỗ trợ API nên việc này mình phải sử lí thủ công.
Mình chưa tìm cách đăng nhập rõ nguyên lí nên việc đăng nhập chỉ có thể sử dụng ở trang người dùng (blank page) hoặc trên chính diễn đàn cần đăng nhập.
Lưu ý
Phần kiểm tra trước khi gửi yêu cầu, vì mình không biết cách giới hạn tên người dùng và mật khẩu nên mình để tạm như vậy, khi bạn bạn nào gé qua góp ý cho mình sửa.
Kịch bản
- Code:
var _lh = {};
_lh.requestlogin = function(url, data, start, callback) {
var url = typeof url == 'string' ? url : null,
data = typeof data == 'object' ? data : null;
start = typeof start == 'function' ? start : function() {},
callback = typeof callback == 'function' ? callback : function() {};
if ((typeof data.username != 'string' && typeof data.username != 'number') || (typeof data.password != 'string' && typeof data.password != 'number')) {
callback(false, null, null);
return false;
} else if (!(/^([a-zA-Z0-9\_\.]{6,})$/.test(data.username)) || !(/^([\S\s]{6,})$/.test(data.password))) {
callback(false, null, null);
return false;
}
data.remember = typeof data.remember == 'number' && (/^(0|1)$/).test(data.remember) ? data.remember : 0;
var input = {
'username': data.username,
'password': data.password,
'autologin': data.remember,
'login': ''
};
var data = new FormData();
for (var label in input) {
var value = input[label];
data.append(label, value);
}
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200 && xhr.responseText != null && new RegExp(!/<[a-z][\s\S]*>/i).test(xhr.responseText)) {
var objMatch = ((xhr.responseText).replace(/((\s+)|(\n+))/g, '')).match(/(((if\(typeof\(_userdata\)\=\="undefined"\)var\_userdata\=newObject\(\)\;\_userdata\["session_logged_in"\]\=)(0|1)(\;))(\_userdata\["username"\]\=")([a-zA-Z0-9]+)("\;)(\_userdata\["user\_id"\]\=)([0-9\-]+)(\;))/i);
var isLogin = typeof objMatch == 'object' && typeof objMatch[4] == 'string' ? Number(objMatch[4]) : null;
var userName = typeof objMatch == 'object' && typeof objMatch[7] == 'string' ? objMatch[7] : null;
var userId = typeof objMatch == 'object' && typeof objMatch[10] == 'string' ? Number(objMatch[10]) : null;
callback(true, {
'login': isLogin,
'username': userName,
'userid': userId
}, xhr);
}
}
};
xhr.open("POST", url + '/login', true);
xhr.send(data);
start(xhr);
};
Sử dụng
- Code:
_lh.requestlogin('đường dẫn diễn đàn - trang chính', {
'username': 'tên đăng nhập',
'password': 'nhập khẩu'
}, function (xhr) { // gọi lại lúc vừa gửi.
// xhr: dữ liệu về yêu cầu
}, function(returnValue, data, xhr) { // gọi lại lúc kết thúc.
// returnValue: giá trị trả về (true: hoàn thành, false: không hoàn thành)
// data: thông tin người dùng (login: trạng thái đăng nhập, username: tên người dùng, userid: id người dùng)
// xhr: dữ liệu về yêu cầu
});
Ứng dụng
- Code:
đang cập nhật
Mình đã thử chạy trên diễn đàn Devs và một số diễn đàn khác, đã thành công.
Nếu gặp vấn đề về kịch bản, vui lòng để lại lời nhắn.