diff --git a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java index a35b49a7d8..3f8a626845 100644 --- a/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java +++ b/src/main/java/com/alibaba/druid/support/JSONDruidStatService.java @@ -27,7 +27,7 @@ public class JSONDruidStatService { private final static JSONDruidStatService instance = new JSONDruidStatService(); - private static DruidStatManagerFacade statManagerFacade = DruidStatManagerFacade.getInstance(); + private static DruidStatManagerFacade statManagerFacade = DruidStatManagerFacade.getInstance(); public final static int RESULT_CODE_SUCCESS = 1; public final static int RESULT_CODE_ERROR = -1; @@ -105,6 +105,11 @@ public class JSONDruidStatService { return returnJSONResult(RESULT_CODE_SUCCESS, getWebSessionStatDataList(parameters)); } + if (url.startsWith("/websession-") && url.indexOf(".json") > 0) { + String id = StringUtils.subString(url, "websession-", ".json"); + return returnJSONResult(RESULT_CODE_SUCCESS, getWebSessionDetail(id)); + } + if (url.startsWith("/spring.json")) { return returnJSONResult(RESULT_CODE_SUCCESS, getSpringStatDataList(parameters)); } @@ -122,6 +127,10 @@ public class JSONDruidStatService { return comparatorOrderBy(array, parameters); } + private Map getWebSessionDetail(String sessionId) { + return WebAppStatManager.getInstance().getSessionStat(sessionId); + } + private List> getWebSessionStatDataList(Map parameters) { List> array = WebAppStatManager.getInstance().getSessionStatData(); return array; diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java index 05154926f9..f009952d2b 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStat.java @@ -145,6 +145,16 @@ public class WebAppStat { public WebSessionStat getSessionStat(String sessionId) { return getSessionStat(sessionId, false); } + + public Map getSessionStatData(String sessionId) { + WebSessionStat uriStat = sessionStatMap.get(sessionId); + + if (uriStat == null) { + return null; + } + + return uriStat.getStatData(); + } public WebSessionStat getSessionStat(String sessionId, boolean create) { sessionStatLock.readLock().lock(); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatManager.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatManager.java index ca24711fc9..f57b3b1334 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatManager.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatManager.java @@ -65,6 +65,19 @@ public class WebAppStatManager { return allAppUriStatDataList; } + + public Map getSessionStat(String sessionId) { + Set stats = getWebAppStatSet(); + + for (Object stat : stats) { + Map statData = WebAppStatUtils.getSessionStatData(stat, sessionId); + if (statData != null) { + return statData; + } + } + + return null; + } public void addWebAppStatSet(Object webAppStat) { getWebAppStatSet().add(webAppStat); diff --git a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatUtils.java b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatUtils.java index 9943c73e9e..3c0a0a5956 100644 --- a/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatUtils.java +++ b/src/main/java/com/alibaba/druid/support/http/stat/WebAppStatUtils.java @@ -58,6 +58,22 @@ public class WebAppStatUtils { return null; } } + + @SuppressWarnings("unchecked") + public static Map getSessionStatData(Object webStat, String sessionId) { + if (webStat.getClass() == WebAppStat.class) { + return ((WebAppStat) webStat).getSessionStatData(sessionId); + } + + try { + Method method = webStat.getClass().getMethod("getSessionStatData", String.class); + Object obj = method.invoke(webStat); + return (Map) obj; + } catch (Exception e) { + LOG.error("getSessionStatData error", e); + return null; + } + } public static void reset(Object webStat) { if (webStat.getClass() == WebAppStat.class) { diff --git a/src/main/resources/support/http/resources/js/websession-detail.js b/src/main/resources/support/http/resources/js/websession-detail.js new file mode 100644 index 0000000000..aa5609347a --- /dev/null +++ b/src/main/resources/support/http/resources/js/websession-detail.js @@ -0,0 +1,30 @@ +function ajaxRequestForSqlInfo() { + var sessionId = getUrlVar("sessionId"); + xmlHttpForConnectionInfo = getRequestObject(); + sendRequest(xmlHttpForConnectionInfo, 'websession-' + sessionId + '.json', ajaxResponseForSqlInfo) +} + +function ajaxResponseForSqlInfo() { + var stat = getJSONResponseContent(xmlHttpForConnectionInfo); + if (stat == null) + return; + + changeInnerHtml("SESSIONID", stat.SESSIONID); + if (stat.Principal) { + changeInnerHtml("Principal", stat.Principal); + } + changeInnerHtml("CreateTime", stat.CreateTime); + changeInnerHtml("LastAccessTime", stat.LastAccessTime); + changeInnerHtml("UserAgent", stat.UserAgent); + changeInnerHtml("RemoteAddress", stat.RemoteAddress); + changeInnerHtml("RequestCount", stat.RequestCount); + changeInnerHtml("RequestTimeMillisTotal", stat.RequestTimeMillisTotal); + changeInnerHtml("RunningCount", stat.RunningCount); + changeInnerHtml("ConcurrentMax", stat.ConcurrentMax); + changeInnerHtml("JdbcExecuteCount", stat.JdbcExecuteCount); + changeInnerHtml("JdbcExecuteTimeMillis", stat.JdbcExecuteTimeMillis); + changeInnerHtml("JdbcCommitCount", stat.JdbcCommitCount); + changeInnerHtml("JdbcRollbackCount", stat.JdbcRollbackCount); + changeInnerHtml("JdbcFetchRowCount", stat.JdbcFetchRowCount); + changeInnerHtml("JdbcUpdateCount", stat.JdbcUpdateCount); +} diff --git a/src/main/resources/support/http/resources/js/websession.js b/src/main/resources/support/http/resources/js/websession.js index d14117e272..14d5769ab0 100644 --- a/src/main/resources/support/http/resources/js/websession.js +++ b/src/main/resources/support/http/resources/js/websession.js @@ -98,7 +98,8 @@ function handleAjaxResult() { var stat = statList[i]; var newRow = sqlStatTable.insertRow(-1); newRow.insertCell(-1).innerHTML = i+1; - newRow.insertCell(-1).innerHTML = stat.SESSIONID; + newRow.insertCell(-1).innerHTML = '' + stat.SESSIONID + ''; + if (stat.Principal) { newRow.insertCell(-1).innerHTML = stat.Principal; } else { diff --git a/src/main/resources/support/http/resources/websession-detail.html b/src/main/resources/support/http/resources/websession-detail.html new file mode 100644 index 0000000000..f127ed2b4b --- /dev/null +++ b/src/main/resources/support/http/resources/websession-detail.html @@ -0,0 +1,89 @@ + + + + + + + + + + + +
+
+
+

Web Session View

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SESSIONID
UserAgent
CreateTime
LastAccessTime
RemoteAddress
RequestCount
RequestTimeMillisTotal
RunningCount
ConcurrentMax
JdbcExecuteCount
JdbcExecuteTimeMillis
JdbcCommitCount
JdbcRollbackCount
JdbcFetchRowCount
JdbcUpdateCount
+
+
+ +