1.proxy日志

2.处理长字符串、转义
This commit is contained in:
chenjinsong
2018-08-01 14:05:32 +08:00
parent 38fda1a98d
commit 2c07f0e82d
7 changed files with 474 additions and 17 deletions

View File

@@ -0,0 +1,112 @@
package com.nis.domain.log;
public class PxyHttpLog extends BaseLogEntity<NtcIpLog> {
private static final long serialVersionUID = -3046458130302949428L;
private String url;
private String reqLine;
private String resLine;
private String cookie;
private String referer;
private String userAgent;
private String contentLen;
private String contentType;
private String setCookie;
private String reqHeader;
private String respHeader;
private String reqBody;
private String resBody;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getReqLine() {
return reqLine;
}
public void setReqLine(String reqLine) {
this.reqLine = reqLine;
}
public String getResLine() {
return resLine;
}
public void setResLine(String resLine) {
this.resLine = resLine;
}
public String getCookie() {
return cookie;
}
public void setCookie(String cookie) {
this.cookie = cookie;
}
public String getReferer() {
return referer;
}
public void setReferer(String referer) {
this.referer = referer;
}
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
public String getContentLen() {
return contentLen;
}
public void setContentLen(String contentLen) {
this.contentLen = contentLen;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getSetCookie() {
return setCookie;
}
public void setSetCookie(String setCookie) {
this.setCookie = setCookie;
}
public String getReqHeader() {
return reqHeader;
}
public void setReqHeader(String reqHeader) {
this.reqHeader = reqHeader;
}
public String getRespHeader() {
return respHeader;
}
public void setRespHeader(String respHeader) {
this.respHeader = respHeader;
}
public String getReqBody() {
return reqBody;
}
public void setReqBody(String reqBody) {
this.reqBody = reqBody;
}
public String getResBody() {
return resBody;
}
public void setResBody(String resBody) {
this.resBody = resBody;
}
@Override
public String toString() {
return "{\"url\"=\"" + url + "\", \"reqLine\"=\"" + reqLine
+ "\", \"resLine\"=\"" + resLine + "\", \"cookie\"=\"" + cookie
+ "\", \"referer\"=\"" + referer + "\", \"userAgent\"=\""
+ userAgent + "\", \"contentLen\"=\"" + contentLen
+ "\", \"contentType\"=\"" + contentType
+ "\", \"setCookie\"=\"" + setCookie + "\", \"reqHeader\"=\""
+ reqHeader + "\", \"respHeader\"=\"" + respHeader
+ "\", \"reqBody\"=\"" + reqBody + "\", \"resBody\"=\""
+ resBody + "\"}";
}
}

View File

@@ -417,6 +417,7 @@ public final class Constants {
public static final String NTC_MMPORNVIDEOLEVEL_LOG = Configurations.getStringProperty("mmPornVideoLevelLog", ""); public static final String NTC_MMPORNVIDEOLEVEL_LOG = Configurations.getStringProperty("mmPornVideoLevelLog", "");
public static final String NTC_MMSAMPLEPIC_LOG = Configurations.getStringProperty("mmSamplePicLog", ""); public static final String NTC_MMSAMPLEPIC_LOG = Configurations.getStringProperty("mmSamplePicLog", "");
public static final String NTC_MMSAMPLEVOIP_LOG = Configurations.getStringProperty("mmSampleVoipLog", ""); public static final String NTC_MMSAMPLEVOIP_LOG = Configurations.getStringProperty("mmSampleVoipLog", "");
public static final String PXY_HTTP_LOG = Configurations.getStringProperty("pxyHttpLog", "");
//报表类型,1- 配置命中总量业务 //报表类型,1- 配置命中总量业务
public static final Integer BUSINESSTYPE_CONFIG=Configurations.getIntProperty("businesstype_config", 1); public static final Integer BUSINESSTYPE_CONFIG=Configurations.getIntProperty("businesstype_config", 1);

View File

@@ -0,0 +1,94 @@
package com.nis.web.controller.log.pxy;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.support.RequestContext;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.nis.domain.PageLog;
import com.nis.domain.log.PxyHttpLog;
import com.nis.domain.maat.LogRecvData;
import com.nis.util.Constants;
import com.nis.util.httpclient.HttpClientUtil;
import com.nis.web.controller.BaseController;
@Controller
@RequestMapping("${adminPath}/log/pxy")
public class PxyHttpLogController extends BaseController {
@RequestMapping(value = {"list", "ipInterceptlogs", "domainInterceptlogs", "httpBlocklogs",
"httpRedirectlogs", "httpReplacelogs", "httpMonitogs"})
public String list(@ModelAttribute("log") PxyHttpLog log, Model model, HttpServletRequest request, HttpServletResponse response) {
try {
setLogInfo(request, model, log);
PageLog<PxyHttpLog> page = new PageLog<PxyHttpLog>(request, response);
Map<String, Object> params = new HashMap<String, Object>();
params.put("pageSize", page.getPageSize());
params.put("pageNo", page.getPageNo());
initLogSearchValue(log, params);
String url = Constants.LOG_BASE_URL + Constants.PXY_HTTP_LOG;
String recv = HttpClientUtil.getMsg(url, params, request);
logger.info("查询结果:" + recv);
Gson gson = new GsonBuilder().create();
LogRecvData<PxyHttpLog> fromJson = gson.fromJson(recv, new TypeToken<LogRecvData<PxyHttpLog>>(){}.getType());
if (fromJson.getStatus().intValue() == 200) {
page.setList(fromJson.getData().getList());
List<PxyHttpLog> list = page.getList();
for (PxyHttpLog l : list) {
l.setFunctionId(log.getFunctionId());
setLogAction(l);
}
model.addAttribute("page", page);
}
} catch (Exception e) {
logger.error("查询失败", e);
addMessage(model, e.getMessage());
}
return "/log/pxy/pxyHttpList";
}
private void setLogInfo(HttpServletRequest request, Model model, PxyHttpLog log) {
int functionId = log.getFunctionId();
RequestContext requestContext = new RequestContext(request);
if (functionId == 200) {
model.addAttribute("logTitle", requestContext.getMessage("ip_intercept"));
log.setAction(1);
} else if (functionId == 201) {
model.addAttribute("logTitle", requestContext.getMessage("domain_intercept"));
log.setAction(1);
} else if (functionId == 207) {
model.addAttribute("logTitle", requestContext.getMessage("http_block"));
log.setAction(16);
} else if (functionId == 208) {
model.addAttribute("logTitle", requestContext.getMessage("http_redirect"));
log.setAction(48);
} else if (functionId == 209) {
model.addAttribute("logTitle", requestContext.getMessage("http_replace"));
log.setAction(80);
} else if (functionId == 210) {
model.addAttribute("logTitle", requestContext.getMessage("http_monit"));
log.setAction(1);
}
}
}

View File

@@ -262,6 +262,7 @@ mmPornAudioLevelLog=mmPornAudioLevelLogs
mmPornVideoLevelLog=mmPornVideoLevelLogs mmPornVideoLevelLog=mmPornVideoLevelLogs
mmSamplePicLog=mmSamplePicLogs mmSamplePicLog=mmSamplePicLogs
mmSampleVoipLog=mmSampleVoipLogs mmSampleVoipLog=mmSampleVoipLogs
pxyHttpLog=pxyHttpLogs
######################################## ########################################
#大屏图表展示服务接口 #大屏图表展示服务接口
dashboardUrl=http://10.0.6.101:8080/galaxy/service/log/v1/ dashboardUrl=http://10.0.6.101:8080/galaxy/service/log/v1/
@@ -395,7 +396,7 @@ digest_single_file_max_size=10485760
digest_total_file_max_size=12582912 digest_total_file_max_size=12582912
#YSP文件保存路径 #YSP文件保存路径
#av_file_path=/home/ysp/ #av_file_path=/home/ysp/
av_file_path=D:\\ysp\\ av_file_path=D\:\\ysp\\
#YSP文件特征类型 #YSP文件特征类型
av_sample_audio_region=av_sample_audio av_sample_audio_region=av_sample_audio
av_sample_video_region=av_sample_video av_sample_video_region=av_sample_video
@@ -411,9 +412,9 @@ av_sample_voip_region=av_sample_voip
#audio_sample_proc_param_is_translation=false #audio_sample_proc_param_is_translation=false
#video_sample_proc_param_is_translation=false #video_sample_proc_param_is_translation=false
#picture_sample_proc_param_is_translation=false #picture_sample_proc_param_is_translation=false
audio_sample_create_proc=java -jar D:\\sampleTest.jar audio_sample_create_proc=java -jar D\:\\sampleTest.jar
video_sample_create_proc=java -jar D:\\sampleTest.jar video_sample_create_proc=java -jar D\:\\sampleTest.jar
picture_sample_create_proc=java -jar D:\\sampleTest.jar picture_sample_create_proc=java -jar D\:\\sampleTest.jar
audio_sample_proc_param_is_quotation=false audio_sample_proc_param_is_quotation=false
video_sample_proc_param_is_quotation=false video_sample_proc_param_is_quotation=false
picture_sample_proc_param_is_quotation=false picture_sample_proc_param_is_quotation=false

View File

@@ -207,15 +207,32 @@ $(document).ready(function(){
<td>${log.pid}</td> <td>${log.pid}</td>
<td> <td>
<c:if test="${fn:startsWith(log.url, 'http')}">${log.url }</c:if> <%-- <c:if test="${fn:startsWith(log.url, 'http')}">${log.url }</c:if>
<c:if test="${!fn:startsWith(log.url, 'http')}">http://${log.url }</c:if> <c:if test="${!fn:startsWith(log.url, 'http')}">http://${log.url }</c:if> --%>
<c:if test="${fn:startsWith(log.url, 'http')}">
<c:set var="url" value="${log.url }"/>
</c:if>
<c:if test="${!fn:startsWith(log.url, 'http')}">
<c:set var="url" value="http://${log.url }"/>
</c:if>
<span data-original-title="${fns:escapeHtml(url)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">
${fns:stringFormat(url,30)}
</span>
</td> </td>
<td> <td>
<a target="_blank" href=' <c:if test="${fn:startsWith(log.logUri, 'http')}">
<c:if test="${fn:startsWith(log.logUri, \"http\")}">${log.logUri }</c:if> <c:set var="logUri" value="${log.logUri }"/>
<c:if test="${!fn:startsWith(log.logUri, \"http\")}">http://${log.logUri }</c:if>'>http://${log.logUri }</a> </c:if>
<c:if test="${!fn:startsWith(log.logUri, 'http')}">
<c:set var="logUri" value="http://${log.logUri }"/>
</c:if>
<a target="_blank" href='${fns:escapeHtml(logUri)}' data-original-title="${fns:escapeHtml(logUri)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">
${fns:stringFormat(logUri,30)}
</a>
<%-- <c:if test="${fn:startsWith(log.logUri, \"http\")}">${log.logUri }</c:if>
<c:if test="${!fn:startsWith(log.logUri, \"http\")}">http://${log.logUri }</c:if>'>http://${log.logUri }</a> --%>
</td> </td>
<td>${log.refer}</td> <td><span data-original-title="${fns:escapeHtml(log.refer)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">${fns:stringFormat(log.refer,30)}</span></td>
<td>${log.level}</td> <td>${log.level}</td>
<!--0动态黑名单FD1静态配置FD2首次分析命中 --> <!--0动态黑名单FD1静态配置FD2首次分析命中 -->
<td> <td>
@@ -247,7 +264,7 @@ $(document).ready(function(){
<c:if test="${log.streamDir==dic.itemCode}"><spring:message code="${dic.itemValue }"/></c:if> <c:if test="${log.streamDir==dic.itemCode}"><spring:message code="${dic.itemValue }"/></c:if>
</c:forEach> </c:forEach>
</td> </td>
<td>${log.addrList}</td> <td><span data-original-title="${fns:escapeHtml(log.addrList)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">${fns:stringFormat(log.addrList,30)}</span></td>
<td>${log.serverLocate}</td> <td>${log.serverLocate}</td>
<td>${log.clientLocate}</td> <td>${log.clientLocate}</td>
</tr> </tr>

View File

@@ -207,13 +207,30 @@ $(document).ready(function(){
<td>${log.pid}</td> <td>${log.pid}</td>
<td> <td>
<c:if test="${fn:startsWith(log.url, 'http')}">${log.url }</c:if> <%-- <c:if test="${fn:startsWith(log.url, 'http')}">${log.url }</c:if>
<c:if test="${!fn:startsWith(log.url, 'http')}">http://${log.url }</c:if> <c:if test="${!fn:startsWith(log.url, 'http')}">http://${log.url }</c:if> --%>
<c:if test="${fn:startsWith(log.url, 'http')}">
<c:set var="url" value="${log.url }"/>
</c:if>
<c:if test="${!fn:startsWith(log.url, 'http')}">
<c:set var="url" value="http://${log.url }"/>
</c:if>
<span data-original-title="${fns:escapeHtml(url)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">
${fns:stringFormat(url,30)}
</span>
</td> </td>
<td> <td>
<a target="_blank" href=' <c:if test="${fn:startsWith(log.logUri, 'http')}">
<c:if test="${fn:startsWith(log.logUri, \"http\")}">${log.logUri }</c:if> <c:set var="logUri" value="${log.logUri }"/>
<c:if test="${!fn:startsWith(log.logUri, \"http\")}">http://${log.logUri }</c:if>'>http://${log.logUri }</a> </c:if>
<c:if test="${!fn:startsWith(log.logUri, 'http')}">
<c:set var="logUri" value="http://${log.logUri }"/>
</c:if>
<a target="_blank" href='${fns:escapeHtml(logUri)}' data-original-title="${fns:escapeHtml(logUri)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">
${fns:stringFormat(logUri,30)}
</a>
<%-- <c:if test="${fn:startsWith(log.logUri, \"http\")}">${log.logUri }</c:if>
<c:if test="${!fn:startsWith(log.logUri, \"http\")}">http://${log.logUri }</c:if>'>http://${log.logUri }</a> --%>
</td> </td>
<td>${log.refer}</td> <td>${log.refer}</td>
<td>${log.level}</td> <td>${log.level}</td>
@@ -247,7 +264,7 @@ $(document).ready(function(){
<c:if test="${log.streamDir==dic.itemCode}"><spring:message code="${dic.itemValue }"/></c:if> <c:if test="${log.streamDir==dic.itemCode}"><spring:message code="${dic.itemValue }"/></c:if>
</c:forEach> </c:forEach>
</td> </td>
<td>${log.addrList}</td> <td title="${fns:escapeHtml(log.addrList)}">${fns:stringFormat(log.addrList,30)}</td>
<td>${log.serverLocate}</td> <td>${log.serverLocate}</td>
<td>${log.clientLocate}</td> <td>${log.clientLocate}</td>
</tr> </tr>

View File

@@ -0,0 +1,215 @@
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/WEB-INF/include/taglib.jsp"%>
<html>
<head>
<title>
${logTitle }<spring:message code="log"/>
</title>
<script>
$(document).ready(function() {
//reset
$("#resetBtn").on("click",function(){
$("select.selectpicker").each(function(){
$(this).selectpicker('val',$(this).find('option:first').val());
$(this).find("option").attr("selected",false);
$(this).find("option:first").attr("selected",true);
});
$(".Wdate").attr("value",'');
$(':input','#searchForm')
.not(':button,:submit,:reset,:hidden')
.attr("value",'');
$("#searchForm")[0].reset();
});
//筛选功能
filterActionInit();
});
</script>
</head>
<body>
<div class="page-content">
<div class="theme-panel hidden-xs hidden-sm">
</div>
<h3 class="page-title">
${logTitle }<spring:message code="log"></spring:message>
<small><spring:message code="date_list"/></small>
</h3>
<h5 class="page-header"></h5>
<div class="col-md-12">
<div class="portlet">
<div class="portlet-body">
<div class="row" >
<form:form id="searchForm" modelAttribute="log" action="${ctx}/log/pxy/list" method="post" class="form-search">
<input id="pageNo" name="pageNo" type="hidden" value="${page.pageNo}"/>
<input id="pageSize" name="pageSize" type="hidden" value="${page.pageSize}"/>
<input id="functionId" name="functionId" type="hidden" value="${log.functionId}"/>
<!-- 筛选按钮展开状态-->
<input id="isFilterAction" name="isFilterAction" type="hidden" value="${log.isFilterAction }"/>
<!-- 搜索内容与操作按钮栏 -->
<div class="col-md-12">
<div class="pull-left">
<div class="input-group">
<div class="input-group-btn">
<span class="selectpicker form-control" ><spring:message code="begin_date"/></span>
</div>
<input name="searchFoundStartTime" type="text" readonly="readonly" maxlength="20" class="form-control Wdate input-medium"
value="${log.searchFoundStartTime}" onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/>
</div>
</div>
<div class="pull-left">
<div class="input-group">
<div class="input-group-btn">
<span class="selectpicker form-control" ><spring:message code="end_date"/></span>
</div>
<input name="searchFoundEndTime" type="text" readonly="readonly" maxlength="20" class="form-control Wdate input-medium"
value="${log.searchFoundEndTime}" onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/>
</div>
</div>
<div class="pull-left">
<button type="button" class="btn blue" onClick="return page()"> <i class="fa fa-search"></i> <spring:message code="search"/> </button>
<button type="button" class="btn btn-default" id="resetBtn"> <i class="fa fa-refresh"></i> <spring:message code="reset"/> </button>
<button type="button" class="btn btn-default" id="filter-btn"> <spring:message code="filter"/><i class="fa fa-angle-double-down"></i></button>
</div>
<div class="pull-right">
<a class="btn btn-icon-only btn-default setfields tooltips"
data-container="body" data-placement="top" data-original-title=<spring:message code="custom_columns"/> href="javascript:;">
<i class="icon-wrench"></i>
</a>
</div>
</div>
<!-- 搜索内容与操作按钮栏 -->
<!-- 筛选搜索内容栏默认隐藏-->
<div class="col-md-12 filter-action-select-panle hide" >
<div class="row">
<div class="col-md-2">
<div class="form-group">
<label class="control-label"><spring:message code='protocol_type'/></label>
<form:select path="transProto" class="selectpicker form-control">
<form:option value=""><spring:message code="select"/></form:option>
<c:forEach items="${fns:getDictList('LOG_PROTOCOL')}" var="protocol" >
<form:option value="${protocol.itemCode}"><spring:message code="${protocol.itemValue}"></spring:message></form:option>
</c:forEach>
</form:select>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label class="control-label"><spring:message code='direct'/></label>
<form:select path="direction" class="selectpicker form-control">
<form:option value=""><spring:message code="select"/></form:option>
<c:forEach items="${fns:getDictList('DIRECTION')}" var="direction" >
<form:option value="${direction.itemCode}"><spring:message code="${direction.itemValue}"></spring:message></form:option>
</c:forEach>
</form:select>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label><spring:message code="entrance"/></label>
<form:select path="entranceId" class="selectpicker form-control" data-live-search="true" data-live-search-placeholder="search">
<form:option value=""><spring:message code="select"/></form:option>
<c:forEach items="${fns:getDictList('ENTRANCE')}" var="entrance" >
<form:option value="${entrance.itemCode}"><spring:message code="${entrance.itemValue}"></spring:message></form:option>
</c:forEach>
</form:select>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label><spring:message code="clj_ip"></spring:message></label>
<input name="capIp" type="text" class="form-control" value="${log.capIp }"/>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label><spring:message code="clientip"></spring:message></label>
<input name="sIp" type="text" class="form-control" value="${log.sIp }"/>
</div>
</div>
<div class="col-md-2">
<div class="form-group">
<label><spring:message code="serverip"></spring:message></label>
<input name="dIp" type="text" class="form-control" value="${log.dIp }"/>
</div>
</div>
</div>
</div>
<!-- /筛选搜索内容栏 结束-->
</form:form>
</div>
<div class="table-responsive">
<sys:message content="${message}"/>
<table id="contentTable" class="table table-striped table-bordered table-condensed text-nowrap">
<thead>
<tr>
<th><spring:message code="cfg_id"/></th>
<th><spring:message code="found_time"/></th>
<th><spring:message code="entrance_id"/></th>
<th><spring:message code="clj_ip"/></th>
<th><spring:message code="protocol"/></th>
<th><spring:message code="server_ip"/></th>
<th><spring:message code="client_ip"/></th>
<th><spring:message code="server_port"/></th>
<th><spring:message code="client_port"/></th>
<th>url</th>
<th><spring:message code="deviceid"/></th>
<th><spring:message code="direction"/></th>
<th><spring:message code="stream_type"/></th>
<th><spring:message code="nest_addr_list"/></th>
<th><spring:message code='server_locate'/></th>
<th><spring:message code='client_locate'/></th>
</tr>
</thead>
<tbody>
<c:forEach var="_log" items="${page.list }" varStatus="status">
<tr>
<td>${_log.cfgId }</td>
<td>${_log.foundTime }</td>
<td>${_log.entranceId }</td>
<td>${_log.capIp }</td>
<td>${_log.transProto }</td>
<td>${_log.dIp }</td>
<td>${_log.sIp }</td>
<td>${_log.dPort }</td>
<td>${_log.sPort }</td>
<td>
<span data-original-title="${fns:escapeHtml(_log.url)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">${fns:stringFormat(_log.url,30)}</span>
</td>
<td>
<c:forEach items="${fns:getDictList('DEVICE')}" var="device">
<c:if test="${device.itemCode eq _log.deviceId}"><spring:message code="${device.itemValue}"/></c:if>
</c:forEach>
</td>
<td>
<c:forEach items="${fns:getDictList('DIRECTION')}" var="direction">
<c:if test="${direction.itemCode eq _log.direction}"><spring:message code="${direction.itemValue}"/></c:if>
</c:forEach>
</td>
<td>
<c:forEach items="${fns:getDictList('LOG_STREAM_TYPE')}" var="streamType">
<c:if test="${streamType.itemCode eq _log.streamDir}">${streamType.itemValue}</c:if>
</c:forEach>
</td>
<td>
<span data-original-title="${fns:escapeHtml(_log.addrList)}" class="tooltips" data-flag="false" data-html="true" data-placement="top">${fns:stringFormat(_log.addrList,30)}</span>
</td>
<td title="${_log.serverLocate}">${fns:abbr(_log.serverLocate,20)}</td>
<td title="${_log.clientLocate}">${fns:abbr(_log.clientLocate,20)}</td>
</tr>
</c:forEach>
</tbody>
</table>
<div class="page">${page}</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>