//全局变量
var urlbase="../../api.php";//api.php基地址
var messageList=null;//记录缓存,用于判断是否有新的记录
var setIntervalID=null;//定时器ID,用于网络自适应,调节timeout
var interval=1000;//向服务器获取记录的时间间隔,同时也是ajax timeout时间
$(document).ready(function () {
var self = this;
var source =
{
datatype: "json",
datafields: [
{ name: 'user_IP' },
{ name: 'location'},
{ name: 'data_type'},
{ name: 'keepsession' },
{ name: 'user_port'},
{ name: 'protocol'},
{ name: 'request_method' },
{ name: 'request_URI' },
{ name: 'request_time' },
{ name: 'headers_data' },
{ name: 'get_data' },
{ name: 'post_data' },
{ name: 'cookie_data' },
{ name: 'decoded_get_data' },
{ name: 'decoded_post_data' },
{ name: 'decoded_cookie_data' },
{ name: 'request_date_string' },
{ name: 'request_time_string' },
{ name: 'request_date_and_time_string' },
{ name: 'client' },
],
id: 'request_time',
url: urlbase+"?cmd=list",
root: 'data',
};
var dataAdapter = new $.jqx.dataAdapter(source,{
downloadComplete: function (data, status, xhr) {
if(status=="success")
{
var i = data.length;
while (i--) {
var date=new Date(data[i].request_time*1000)
data[i].request_date_string=date.getFullYear()+ "年" +(date.getMonth() + 1) + "月" + date.getDate()+ "日";
data[i].request_time_string=date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
data[i].request_date_and_time_string=data[i].request_date_string+" "+data[i].request_time_string;
data[i].keepsession=(data[i].keepsession==true)?"是":"否";
data[i].client=data[i].headers_data["User-Agent"]?get_client_info(data[i].headers_data["User-Agent"]):"未知";
var data_type=new Object();
var get_keys=Object.keys(data[i].get_data);
var post_keys=Object.keys(data[i].post_data);
var cookie_keys=Object.keys(data[i].cookie_data);
if(get_keys.length>0)
data_type.GET=get_keys;
if(post_keys.length>0)
data_type.POST=post_keys;
if(cookie_keys.length>0)
data_type.COOKIE=cookie_keys;
data[i].data_type =JSON.stringify(data_type);
}
return data;
}
},
});
var initrowdetails = function (index, parentElement, gridElement, datarecord) {
var tabsdiv = null;
var information = null;
var notes = null;
var get_grid=null;
var post_grid=null;
var cookie_grid=null;
var headers_grid=null;
tabsdiv = $($(parentElement).children()[0]);
if (tabsdiv != null) {
information = tabsdiv.find('.information');
get_grid = tabsdiv.find('.get_grid');
post_grid = tabsdiv.find('.post_grid');
cookie_grid = tabsdiv.find('.cookie_grid');
headers_grid = tabsdiv.find('.headers_grid');
//datarecord.client=datarecord.headers_data["User-Agent"]?get_client_info(datarecord.headers_data["User-Agent"]):"未知";
var get_data=new Array();
for(key in datarecord.get_data){
var get_data_item=new Array();
get_data_item.push(key);
get_data_item.push(datarecord.get_data[key]);
var decoded_value="";
if(datarecord.decoded_get_data)
decoded_value=datarecord.decoded_get_data[key];
get_data_item.push(decoded_value);
get_data.push(get_data_item);
}
var get_source =
{
localdata: get_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
{ name: 'decoded_value', type: 'string', map: '2' },
],
datatype: "array"
};
var get_source_dataAdapter= new $.jqx.dataAdapter(get_source);
get_grid.jqxGrid(
{
autorowheight: true,
autorowheight: true,
columnsautoresize: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsresize: true,
height: 176,
width: '100%',
source: get_source_dataAdapter,
ready: function () {
if(get_source.localdata.length&&get_source.localdata.length>0)
get_grid.jqxGrid('autoresizecolumn', 'key');
},
columns: datarecord.decoded_get_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value'},
]
});
var post_data=new Array();
for(key in datarecord.post_data){
var post_data_item=new Array();
post_data_item.push(key);
post_data_item.push(datarecord.post_data[key]);
var decoded_value="";
if(datarecord.decoded_post_data)
decoded_value=datarecord.decoded_post_data[key];
post_data_item.push(decoded_value);
post_data.push(post_data_item);
}
var post_source =
{
localdata: post_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
{ name: 'decoded_value', type: 'string', map: '2' },
],
datatype: "array"
};
var post_source_dataAdapter= new $.jqx.dataAdapter(post_source);
post_grid.jqxGrid(
{
ready: function () {
if(post_source.localdata.length&&post_source.localdata.length>0)
post_grid.jqxGrid('autoresizecolumn', 'key');
},
autorowheight: true,
pageable: true,
columnsautoresize: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
height: 176,
width: '100%',
source: post_source_dataAdapter,
columns: datarecord.decoded_post_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
]
});
var cookie_data=new Array();
for(key in datarecord.cookie_data){
var cookie_data_item=new Array();
cookie_data_item.push(key);
cookie_data_item.push(datarecord.cookie_data[key]);
var decoded_value="";
if(datarecord.decoded_cookie_data)
decoded_value=datarecord.decoded_cookie_data[key];
cookie_data_item.push(decoded_value);
cookie_data.push(cookie_data_item);
}
var cookie_source =
{
localdata: cookie_data,
datafields: [
{ name: 'key', type:'string', map:'0'},
{ name: 'value', type:'string', map:'1'},
{ name: 'decoded_value', type:'string', map:'2'},
],
datatype: "array"
};
var cookie_source_dataAdapter= new $.jqx.dataAdapter(cookie_source);
cookie_grid.jqxGrid(
{
ready: function () {
if(cookie_source.localdata.length&&cookie_source.localdata.length>0)
cookie_grid.jqxGrid('autoresizecolumn', 'key');
},
columnsautoresize: true,
autorowheight: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
height: 176,
width: '100%',
source: cookie_source_dataAdapter,
columns: datarecord.decoded_cookie_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
]
});
var headers_data=new Array();
for(key in datarecord.headers_data){
var headers_data_item=new Array();
headers_data_item.push(key);
headers_data_item.push(datarecord.headers_data[key]);
headers_data.push(headers_data_item);
}
var headers_source =
{
localdata: headers_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
],
datatype: "array"
};
var headers_source_dataAdapter= new $.jqx.dataAdapter(headers_source);
headers_grid.jqxGrid(
{
ready: function () {
if(headers_source.localdata.length&&headers_source.localdata.length>0)
headers_grid.jqxGrid('autoresizecolumn', 'key');
},
columnsautoresize: true,
autorowheight: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
width: '100%',
height: 176,
source: headers_source_dataAdapter,
columns: [
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value'},
]
});
var container = $('
')
container.appendTo($(information));
var leftcolumn = $('');
var rightcolumn = $('');
container.append(leftcolumn);
container.append(rightcolumn);
var data_item = "日期: " + datarecord.request_date_string + "
";
var ip_item = "IP: " + datarecord.user_IP + "
";
var method_item = "协议: " + datarecord.request_method + "
";
var location_item = "位置: " + datarecord.location + "
";
$(leftcolumn).append(data_item);
$(leftcolumn).append(ip_item);
$(leftcolumn).append(method_item);
$(leftcolumn).append(location_item);
var time_item = "时间: " + datarecord.request_time_string + "
";
var port_item = "端口: " + datarecord.user_port + "
";
var uri_item = "访问地址: " + datarecord.request_URI + "
";
var client_item = "客户端: " + datarecord.client + "
";
$(rightcolumn).append(time_item);
$(rightcolumn).append(port_item);
$(rightcolumn).append(uri_item);
$(rightcolumn).append(client_item);
$(tabsdiv).jqxTabs({
width:'95%', height: '100%'
});
}
}
$("#panelGrid").jqxGrid(
{
pageable: true,
ready: function () {
//$('#panelGrid').jqxGrid('autoresizecolumn', 'request_date_and_time_string');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'data_type');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'user_IP');
},
pagerrenderer: function() {
var container = $("");
var deleteButton = $("
删除 ");
var clearButton = $("
清空 ");
var searchButton = $("
查询 ");
container.append(deleteButton);
container.append(clearButton);
container.append(searchButton);
deleteButton.jqxButton({width: 65,height: 20});
clearButton.jqxButton({width: 65,height: 20});
searchButton.jqxButton({width: 65,height: 20});
// delete selected row.
deleteButton.click(function(event) {
var selectedrowindex = $("#panelGrid").jqxGrid('getselectedrowindex');
if(selectedrowindex>=0)
{
$('#deleteConfirmWindow').jqxWindow('open');
$("#deleteConfirmWindow").addClass('animated');
}
});
// reload grid data.
clearButton.click(function(event) {
$('#clearConfirmWindow').jqxWindow('open');
$("#clearConfirmWindow").addClass('animated');
//$("#panelGrid").jqxGrid({
// source: getAdapter()
//});
});
// search for a record.
searchButton.click(function(event) {
//var offset = $("#panelGrid").offset();
$("#searchWindow").jqxWindow('open');
$("#searchWindow").addClass('animated');
//$("#jqxwindow").jqxWindow('move', offset.left + 30, offset.top + 30);
});
var pageElementsContainer = $("");
var datainfo = $("#panelGrid").jqxGrid('getdatainformation');
var paginginfo = datainfo.paginginformation;
var leftButton = $("");
leftButton.find('div').addClass('jqx-icon-arrow-left');
leftButton.width(36);
leftButton.jqxButton({
theme: 'energyblue'
});
var rightButton = $("");
rightButton.find('div').addClass('jqx-icon-arrow-right');
rightButton.width(36);
rightButton.jqxButton({
theme: 'energyblue'
});
var label = $("");
label.text("1-" + paginginfo.pagesize + ' of ' + datainfo.rowscount);
leftButton.appendTo(pageElementsContainer);
rightButton.appendTo(pageElementsContainer);
label.appendTo(pageElementsContainer);
pageElementsContainer.appendTo(container);
self.label = label;
// update buttons states.
var handleStates = function(event, button, className, add) {
button.on(event,
function() {
if (add == true) {
button.find('div').addClass(className);
} else button.find('div').removeClass(className);
});
}
rightButton.click(function() {
$("#panelGrid").jqxGrid('gotonextpage');
});
leftButton.click(function() {
$("#panelGrid").jqxGrid('gotoprevpage');
});
return container;
},
//selectionmode: 'multiplerowsextended',
scrollmode: 'logical',
sortable:true,
pagesize:25,
localization: getLocalization('zh'),
width: '100%',
height:$("#nav-section").height()-$("#dash-logo").outerHeight(true)-3,
source: dataAdapter,
enablebrowserselection:true,
columnsresize: true,
rowdetails: true,
rowdetailstemplate: { rowdetails: $("#xss-detail-template").html(), rowdetailsheight: 222 },
initrowdetails: initrowdetails,
columns: [
{ text: '时间', datafield: 'request_date_and_time_string',width:160 },
{ text: 'IP', datafield: 'user_IP'},
{ text: '来源', datafield: 'location' },
{ text: '客户端', datafield: 'client' },
{ text: '请求', datafield: 'request_method' ,width:60},
{ text: '携带数据', datafield: 'data_type'},
{ text: '保持连接', datafield: 'keepsession',width:60,cellsalign: 'center'}
]
});
$("#panelGrid").on('pagechanged', function () {
var datainfo = $("#panelGrid").jqxGrid('getdatainformation');
var paginginfo = datainfo.paginginformation;
self.label.text(1 + paginginfo.pagenum * paginginfo.pagesize + "-" + Math.min(datainfo.rowscount, (paginginfo.pagenum + 1) * paginginfo.pagesize) + ' of ' + datainfo.rowscount);
});
/*所有窗口初始化*/
//删除记录确认窗口
$('#deleteConfirmWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#deleteConfirm_ok'), cancelButton: $('#deleteConfirm_cancel'),
autoOpen: false,
});
$('#deleteConfirm_ok').jqxButton({ width: '65px' });
$('#deleteConfirm_cancel').jqxButton({ width: '65px' });
$('#deleteConfirmWindow').on('close', function (event) {
if (event.args.dialogResult.OK) {
var selectedrowindex = $("#panelGrid").jqxGrid('getselectedrowindex');
var id = $("#panelGrid").jqxGrid('getrowid', selectedrowindex);
$.ajax({
url: urlbase+"?cmd=del&id="+id,
dataType: "json",
timeout : interval,
success: function(data)
{
if(data==true)
$("#panelGrid").jqxGrid('deleterow', id);
else
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
},
complete : function(XMLHttpRequest,status){
if(status=='timeout')
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
}
});
}
});
//清空记录确认窗口
$('#clearConfirmWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#clearConfirm_ok'), cancelButton: $('#clearConfirm_cancel'),
autoOpen: false,
});
$('#clearConfirm_ok').jqxButton({ width: '65px' });
$('#clearConfirm_cancel').jqxButton({ width: '65px' });
$('#clearConfirmWindow').on('close', function (event) {
if (event.args.dialogResult.OK) {
$.ajax({
url: urlbase+"?cmd=clear",
dataType: "json",
timeout : interval,
success: function(data)
{
if(data==true)
$('#panelGrid').jqxGrid('clear');
else
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
},
complete : function(XMLHttpRequest,status){
if(status=='timeout')
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
}
});
}
});
$('#failedWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#failed_ok'),
autoOpen: false,
});
$('#failed_ok').jqxButton({ width: '65px' });
//查询窗口
$("#searchWindow").jqxWindow({ resizable: false, autoOpen: false, width: 210, height: 180 });
// create find and clear buttons.
$("#findButton").jqxButton({ width: 70});
$("#clearButton").jqxButton({ width: 70});
// find records that match a criteria.
$("#dropdownlist").jqxDropDownList({ autoDropDownHeight: true, selectedIndex: 0, width: 200, height: 23,
source: [
'时间', 'IP', '来源', '客户端','请求', '携带数据', '保持连接'
]
});
$("#findButton").click(function () {
$("#panelGrid").jqxGrid('clearfilters');
var searchColumnIndex = $("#dropdownlist").jqxDropDownList('selectedIndex');
var datafield = "";
switch (searchColumnIndex) {
case 0:
datafield = "request_date_and_time_string";
break;
case 1:
datafield = "user_IP";
break;
case 2:
datafield = "location";
break;
case 3:
datafield = "client";
break;
case 4:
datafield = "request_method";
break;
case 5:
datafield = "data_type";
break;
case 6:
datafield = "keepsession";
break;
}
var searchText = $("#inputField").val();
var filtergroup = new $.jqx.filter();
var filter_or_operator = 1;
var filtervalue = searchText;
var filtercondition = 'contains';
var filter = filtergroup.createfilter('stringfilter', filtervalue, filtercondition);
filtergroup.addfilter(filter_or_operator, filter);
$("#panelGrid").jqxGrid('addfilter', datafield, filtergroup);
// apply the filters.
$("#panelGrid").jqxGrid('applyfilters');
});
// clear filters.
$("#clearButton").click(function () {
$("#panelGrid").jqxGrid('clearfilters');
});
//主面板大小自适应
$(window).resize(function() {
$('#panelGrid').jqxGrid({ height: $("#nav-section").height()-$("#dash-logo").outerHeight(true)-3 });
//$('#panelGrid').jqxGrid('autoresizecolumn', 'request_date_and_time_string');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'data_type');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'user_IP');
});
//定时判断是否有新的记录
checkNewMessages();
setIntervalID=setInterval(checkNewMessages, interval);
});
//获取新列表
function checkNewMessages(){
$.ajax({
url: urlbase+"?cmd=simplelist",
dataType: "json",
timeout : interval,
success: function(data)
{
if(messageList)
{
var sum=0;
var lastedID=null;
for(var id in data) {
if(messageList.indexOf(data[id])<0)
{
sum++;
lastedID=data[id];
}
}
if(sum>0)
showNotification(sum,lastedID,interval);
}
messageList=data;
},
complete : function(XMLHttpRequest,status){
if(status=='timeout'){
interval*=2;
if(setIntervalID)
{
clearInterval(setIntervalID);
if(interval<10000)
setIntervalID=setInterval(checkNewMessages, interval);
}
}
}
});
}
//根据useragent判断操作系统,浏览器版本
function get_client_info(agent){
var browser = "未知浏览器";
var browser_version = "";
if (agent.indexOf("Firefox/") > 0) {
var bv=agent.match(/Firefox\/([^;)]+)+/i);
browser = "Firefox";
browser_version = bv[1]; //获取火狐浏览器的版本号
} else if (agent.indexOf("Maxthon") > 0) {
var bv=agent.match(/Maxthon\/([\d\.]+)/);
browser = "傲游";
browser_version = bv[1];
} else if (agent.indexOf("MSIE") > 0) {
var bv=agent.match(/MSIE\s+([^;)]+)+/i);
browser = "IE";
browser_version = bv[1]; //获取IE的版本号
} else if (agent.indexOf("OPR") > 0) {
var bv=agent.match(/OPR\/([\d\.]+)/);
browser = "Opera";
browser_version = bv[1];
} else if(agent.indexOf("Edge") > 0) {
//win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
var bv=agent.match(/Edge\/([\d\.]+)/);
browser = "Edge";
browser_version = bv[1];
} else if (agent.indexOf("Chrome") > 0) {
var bv=agent.match(/Chrome\/([\d\.]+)/);
browser = "Chrome";
browser_version = bv[1]; //获取google chrome的版本号
} else if(agent.indexOf('rv:')>0 && agent.indexOf('Gecko')>0){
var bv=agent.match(/rv:([\d\.]+)/);
browser = "IE";
browser_version = bv[1];
}
browser_version=browser_version.match(/^[0-9\.]+$/)?browser_version:"未知";
$os = '未知操作系统';
if (agent.match(/win/i) && (agent.indexOf("95") > 0))
$os = 'Windows 95';
else if (agent.match(/win 9x/i) && (agent.indexOf("4.90") > 0))
$os = 'Windows ME';
else if (agent.match(/win/i) && agent.match(/98/i))
$os = 'Windows 98';
else if (agent.match(/win/i) && agent.match(/nt 6.0/i))
$os = 'Windows Vista';
else if (agent.match(/win/i) && agent.match(/nt 6.1/i))
$os = 'Windows 7';
else if (agent.match(/win/i) && agent.match(/nt 6.2/i))
$os = 'Windows 8';
else if(agent.match(/win/i) && agent.match(/nt 10.0/i))
$os = 'Windows 10';
else if (agent.match(/win/i) && agent.match(/nt 5.1/i))
$os = 'Windows XP';
else if (agent.match(/win/i) && agent.match(/nt 5/i))
$os = 'Windows 2000';
else if (agent.match(/win/i) && agent.match(/nt/i))
$os = 'Windows NT';
else if (agent.match(/win/i) && agent.match(/32/i))
$os = 'Windows 32';
else if (agent.match(/linux/i))
$os = 'Linux';
else if (agent.match(/unix/i))
$os = 'Unix';
else if (agent.match(/sun/i) && agent.match(/os/i))
$os = 'SunOS';
else if (agent.match(/ibm/i) && agent.match(/os/i))
$os = 'IBM OS/2';
else if (agent.match(/Mac/i) && agent.match(/PC/i))
$os = 'Macintosh';
else if (agent.match(/PowerPC/i))
$os = 'PowerPC';
else if (agent.match(/AIX/i))
$os = 'AIX';
else if (agent.match(/HPUX/i))
$os = 'HPUX';
else if (agent.match(/NetBSD/i))
$os = 'NetBSD';
else if (agent.match(/BSD/i))
$os = 'BSD';
else if (agent.match(/OSF1/i))
$os = 'OSF1';
else if (agent.match(/IRIX/i))
$os = 'IRIX';
else if (agent.match(/FreeBSD/i))
$os = 'FreeBSD';
else if (agent.match(/teleport/i))
$os = 'teleport';
else if (agent.match(/flashget/i))
$os = 'flashget';
else if (agent.match(/webzip/i))
$os = 'webzip';
else if (agent.match(/offline/i))
$os = 'offline';
return $os+' '+browser+'('+browser_version+')';
}