/* * Copyright 1999-2017 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.druid.support.http; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import com.alibaba.druid.filter.stat.StatFilterContextListenerAdapter; import com.alibaba.druid.support.http.stat.WebAppStat; import com.alibaba.druid.support.http.stat.WebRequestStat; import com.alibaba.druid.support.http.stat.WebSessionStat; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.druid.util.DruidWebUtils; public class AbstractWebStatImpl { private final static Log LOG = LogFactory.getLog(AbstractWebStatImpl.class); public final static int DEFAULT_MAX_STAT_SESSION_COUNT = 1000 * 1; protected WebAppStat webAppStat = null; protected boolean sessionStatEnable = true; protected int sessionStatMaxCount = DEFAULT_MAX_STAT_SESSION_COUNT; protected boolean createSession = false; protected boolean profileEnable = false; protected String contextPath; protected String principalSessionName; protected String principalCookieName; protected String realIpHeader; protected WebStatFilterContextListener statFilterContextListener = new WebStatFilterContextListener(); public boolean isSessionStatEnable() { return sessionStatEnable; } public void setSessionStatEnable(boolean sessionStatEnable) { this.sessionStatEnable = sessionStatEnable; } public boolean isProfileEnable() { return profileEnable; } public void setProfileEnable(boolean profileEnable) { this.profileEnable = profileEnable; } public String getContextPath() { return contextPath; } public int getSessionStatMaxCount() { return sessionStatMaxCount; } public String getRequestURI(HttpServletRequest request) { return request.getRequestURI(); } public String getPrincipalSessionName() { return principalSessionName; } public String getPrincipalCookieName() { return principalCookieName; } public WebSessionStat getSessionStat(HttpServletRequest request) { if (!isSessionStatEnable()) { return null; } WebSessionStat sessionStat = null; String sessionId = getSessionId(request); if (sessionId != null) { sessionStat = webAppStat.getSessionStat(sessionId, true); } if (sessionStat != null) { long currentMillis = System.currentTimeMillis(); String userAgent = request.getHeader("user-agent"); if (sessionStat.getCreateTimeMillis() == -1L) { HttpSession session = request.getSession(false); if (session != null) { sessionStat.setCreateTimeMillis(session.getCreationTime()); } else { sessionStat.setCreateTimeMillis(currentMillis); } webAppStat.computeUserAgent(userAgent); webAppStat.incrementSessionCount(); } sessionStat.setUserAgent(userAgent); String ip = getRemoteAddress(request); sessionStat.addRemoteAddress(ip); } return sessionStat; } protected String getRemoteAddress(HttpServletRequest request) { String ip = null; if (this.realIpHeader != null && this.realIpHeader.length() != 0) { ip = request.getHeader(realIpHeader); } if (ip == null || ip.length() == 0) { ip = DruidWebUtils.getRemoteAddr(request); } return ip; } public String getSessionId(HttpServletRequest httpRequest) { String sessionId = null; HttpSession session = httpRequest.getSession(createSession); if (session != null) { sessionId = session.getId(); } return sessionId; } public String getPrincipal(HttpServletRequest httpRequest) { if (principalSessionName != null) { HttpSession session = httpRequest.getSession(createSession); if (session == null) { return null; } Object sessionValue = null; try { sessionValue = session.getAttribute(principalSessionName); } catch (Exception ex) { if (LOG.isErrorEnabled()) { LOG.error("session.getAttribute error", ex); } } if (sessionValue == null) { return null; } return sessionValue.toString(); } if (principalCookieName != null && httpRequest.getCookies() != null) { for (Cookie cookie : httpRequest.getCookies()) { if (principalCookieName.equals(cookie.getName())) { return cookie.getValue(); } } } return null; } public class WebStatFilterContextListener extends StatFilterContextListenerAdapter { @Override public void addUpdateCount(int updateCount) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.addJdbcUpdateCount(updateCount); } } @Override public void addFetchRowCount(int fetchRowCount) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.addJdbcFetchRowCount(fetchRowCount); } } @Override public void executeBefore(String sql, boolean inTransaction) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcExecuteCount(); } } @Override public void executeAfter(String sql, long nanos, Throwable error) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.addJdbcExecuteTimeNano(nanos); if (error != null) { reqStat.incrementJdbcExecuteErrorCount(); } } } @Override public void commit() { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcCommitCount(); } } @Override public void rollback() { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcRollbackCount(); } } @Override public void pool_connect() { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcPoolConnectCount(); } } @Override public void pool_close(long nanos) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcPoolCloseCount(); } } @Override public void resultSet_open() { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcResultSetOpenCount(); } } @Override public void resultSet_close(long nanos) { WebRequestStat reqStat = WebRequestStat.current(); if (reqStat != null) { reqStat.incrementJdbcResultSetCloseCount(); } } } }