From: markt Date: Thu, 29 Jul 2010 20:53:26 +0000 (+0000) Subject: Add optional support to the HTML Manager application to display Proxy sessions. It... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=6588b9aee398155ee16657748878c01ad11acb4d;p=tomcat7.0 Add optional support to the HTML Manager application to display Proxy sessions. It is disabled by default. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@980567 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/ha/session/BackupManager.java b/java/org/apache/catalina/ha/session/BackupManager.java index 5228b959b..69136e259 100644 --- a/java/org/apache/catalina/ha/session/BackupManager.java +++ b/java/org/apache/catalina/ha/session/BackupManager.java @@ -16,7 +16,9 @@ */ package org.apache.catalina.ha.session; +import java.util.HashSet; import java.util.Iterator; +import java.util.Set; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; @@ -214,11 +216,6 @@ public class BackupManager extends ClusterManagerBase implements MapOwner { this.distributable = dist; } - @Override - public boolean getDistributable() { - return distributable; - } - public void setName(String name) { this.name = name; } @@ -273,4 +270,16 @@ public class BackupManager extends ClusterManagerBase implements MapOwner { } return sb.toString(); } + + public Set getSessionIdsFull() { + Set sessionIds = new HashSet(); + LazyReplicatedMap map = (LazyReplicatedMap)sessions; + @SuppressWarnings("unchecked") // sessions is of type Map + Iterator keys = map.keySetFull().iterator(); + while (keys.hasNext()) { + sessionIds.add(keys.next()); + } + return sessionIds; + } + } diff --git a/java/org/apache/catalina/manager/DummyProxySession.java b/java/org/apache/catalina/manager/DummyProxySession.java new file mode 100644 index 000000000..6c46b6785 --- /dev/null +++ b/java/org/apache/catalina/manager/DummyProxySession.java @@ -0,0 +1,179 @@ +package org.apache.catalina.manager; + +import java.security.Principal; +import java.util.Iterator; + +import javax.servlet.http.HttpSession; + +import org.apache.catalina.Manager; +import org.apache.catalina.Session; +import org.apache.catalina.SessionListener; + +public class DummyProxySession implements Session { + + private String sessionId; + + public DummyProxySession(String sessionId) { + this.sessionId = sessionId; + } + + @Override + public void access() { + // NOOP + } + + @Override + public void addSessionListener(SessionListener listener) { + // NOOP + } + + @Override + public void endAccess() { + // NOOP + } + + @Override + public void expire() { + // NOOP + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public long getCreationTime() { + return 0; + } + + @Override + public String getId() { + return sessionId; + } + + @Override + public String getIdInternal() { + return sessionId; + } + + @Override + public String getInfo() { + return null; + } + + @Override + public long getLastAccessedTime() { + return 0; + } + + @Override + public long getLastAccessedTimeInternal() { + return 0; + } + + @Override + public Manager getManager() { + return null; + } + + @Override + public int getMaxInactiveInterval() { + return 0; + } + + @Override + public Object getNote(String name) { + return null; + } + + @Override + public Iterator getNoteNames() { + return null; + } + + @Override + public Principal getPrincipal() { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public long getThisAccessedTime() { + return 0; + } + + @Override + public long getThisAccessedTimeInternal() { + return 0; + } + + @Override + public boolean isValid() { + return false; + } + + @Override + public void recycle() { + // NOOP + } + + @Override + public void removeNote(String name) { + // NOOP + } + + @Override + public void removeSessionListener(SessionListener listener) { + // NOOP + } + + @Override + public void setAuthType(String authType) { + // NOOP + } + + @Override + public void setCreationTime(long time) { + // NOOP + } + + @Override + public void setId(String id) { + this.sessionId = id; + } + + @Override + public void setManager(Manager manager) { + // NOOP + } + + @Override + public void setMaxInactiveInterval(int interval) { + // NOOP + } + + @Override + public void setNew(boolean isNew) { + // NOOP + } + + @Override + public void setNote(String name, Object value) { + // NOOP + } + + @Override + public void setPrincipal(Principal principal) { + // NOOP + } + + @Override + public void setValid(boolean isValid) { + // NOOP + } +} diff --git a/java/org/apache/catalina/manager/HTMLManagerServlet.java b/java/org/apache/catalina/manager/HTMLManagerServlet.java index dc5ce4e15..67055b216 100644 --- a/java/org/apache/catalina/manager/HTMLManagerServlet.java +++ b/java/org/apache/catalina/manager/HTMLManagerServlet.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -33,6 +34,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.TreeMap; import javax.servlet.ServletException; @@ -45,12 +47,14 @@ import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.Manager; import org.apache.catalina.Session; +import org.apache.catalina.ha.session.BackupManager; import org.apache.catalina.manager.util.BaseSessionComparator; import org.apache.catalina.manager.util.ReverseComparator; import org.apache.catalina.manager.util.SessionUtils; import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.URLEncoder; +import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.http.fileupload.ParameterParser; /** @@ -94,6 +98,8 @@ public final class HTMLManagerServlet extends ManagerServlet { } private final Random randomSource = new Random(); + + private boolean showProxySessions = false; // --------------------------------------------------------- Public Methods @@ -507,9 +513,12 @@ public final class HTMLManagerServlet extends ManagerServlet { args[4] = response.encodeURL (request.getContextPath() + "/html/sessions?path=" + URL_ENCODER.encode(displayPath)); - if (ctxt.getManager() != null) { - args[5] = new Integer - (ctxt.getManager().getActiveSessions()); + Manager manager = ctxt.getManager(); + if (manager instanceof BackupManager && showProxySessions) { + args[5] = new Integer( + ((BackupManager)manager).getActiveSessionsFull()); + } else if (ctxt.getManager() != null){ + args[5] = new Integer(manager.getActiveSessions()); } else { args[5] = new Integer(0); } @@ -542,7 +551,6 @@ public final class HTMLManagerServlet extends ManagerServlet { "/html/expire?path=" + URL_ENCODER.encode(displayPath)); args[9] = appsExpire; args[10] = sm.getString("htmlManagerServlet.expire.explain"); - Manager manager = ctxt.getManager(); if (manager == null) { args[11] = sm.getString("htmlManagerServlet.noManager"); } else { @@ -775,6 +783,16 @@ public final class HTMLManagerServlet extends ManagerServlet { @Override public void init() throws ServletException { super.init(); + + // Set our properties from the initialization parameters + String value = null; + try { + value = getServletConfig().getInitParameter("showProxySessions"); + showProxySessions = Boolean.parseBoolean(value); + } catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + } + } // ------------------------------------------------ Sessions administration @@ -832,7 +850,7 @@ public final class HTMLManagerServlet extends ManagerServlet { displaySessionsListPage(path, req, resp); } - protected Session[] getSessionsForPath(String path) { + protected List getSessionsForPath(String path) { if ((path == null) || (!path.startsWith("/") && path.equals(""))) { throw new IllegalArgumentException(sm.getString("managerServlet.invalidPath", RequestUtil.filter(path))); @@ -845,7 +863,22 @@ public final class HTMLManagerServlet extends ManagerServlet { throw new IllegalArgumentException(sm.getString("managerServlet.noContext", RequestUtil.filter(path))); } - Session[] sessions = ctxt.getManager().findSessions(); + Manager manager = ctxt.getManager(); + List sessions = new ArrayList(); + sessions.addAll(Arrays.asList(manager.findSessions())); + if (manager instanceof BackupManager && showProxySessions) { + // Add dummy proxy sessions + Set sessionIds = + ((BackupManager) manager).getSessionIdsFull(); + // Remove active (primary and backup) session IDs from full list + for (Session session : sessions) { + sessionIds.remove(session.getId()); + } + // Left with just proxy sessions - add them + for (String sessionId : sessionIds) { + sessions.add(new DummyProxySession(sessionId)); + } + } return sessions; } protected Session getSessionForPathAndId(String path, String id) throws IOException { @@ -873,7 +906,7 @@ public final class HTMLManagerServlet extends ManagerServlet { * @throws IOException */ protected void displaySessionsListPage(String path, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - List activeSessions = Arrays.asList(getSessionsForPath(path)); + List sessions = getSessionsForPath(path); String sortBy = req.getParameter("sort"); String orderBy = null; if (null != sortBy && !"".equals(sortBy.trim())) { @@ -887,7 +920,7 @@ public final class HTMLManagerServlet extends ManagerServlet { //orderBy = "DESC"; } try { - Collections.sort(activeSessions, comparator); + Collections.sort(sessions, comparator); } catch (IllegalStateException ise) { // at least 1 of the sessions is invalidated req.setAttribute(APPLICATION_ERROR, "Can't sort session list: one session is invalidated"); @@ -899,7 +932,7 @@ public final class HTMLManagerServlet extends ManagerServlet { // keep sort order req.setAttribute("sort", sortBy); req.setAttribute("order", orderBy); - req.setAttribute("activeSessions", activeSessions); + req.setAttribute("activeSessions", sessions); //strong>NOTE - This header will be overridden // automatically if a RequestDispatcher.forward() call is // ultimately invoked. diff --git a/java/org/apache/catalina/manager/JspHelper.java b/java/org/apache/catalina/manager/JspHelper.java index 1c8aed0e0..ce1064a9f 100644 --- a/java/org/apache/catalina/manager/JspHelper.java +++ b/java/org/apache/catalina/manager/JspHelper.java @@ -73,6 +73,9 @@ public class JspHelper { public static String getDisplayCreationTimeForSession(Session in_session) { try { + if (in_session.getCreationTime() == 0) { + return ""; + } DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT); return formatter.format(new Date(in_session.getCreationTime())); } catch (IllegalStateException ise) { @@ -83,6 +86,9 @@ public class JspHelper { public static String getDisplayLastAccessedTimeForSession(Session in_session) { try { + if (in_session.getLastAccessedTime() == 0) { + return ""; + } DateFormat formatter = new SimpleDateFormat(DATE_TIME_FORMAT); return formatter.format(new Date(in_session.getLastAccessedTime())); } catch (IllegalStateException ise) { @@ -92,14 +98,38 @@ public class JspHelper { } public static String getDisplayUsedTimeForSession(Session in_session) { + try { + if (in_session.getCreationTime() == 0) { + return ""; + } + } catch (IllegalStateException ise) { + //ignore: invalidated session + return ""; + } return secondsToTimeString(SessionUtils.getUsedTimeForSession(in_session)/1000); } public static String getDisplayTTLForSession(Session in_session) { + try { + if (in_session.getCreationTime() == 0) { + return ""; + } + } catch (IllegalStateException ise) { + //ignore: invalidated session + return ""; + } return secondsToTimeString(SessionUtils.getTTLForSession(in_session)/1000); } public static String getDisplayInactiveTimeForSession(Session in_session) { + try { + if (in_session.getCreationTime() == 0) { + return ""; + } + } catch (IllegalStateException ise) { + //ignore: invalidated session + return ""; + } return secondsToTimeString(SessionUtils.getInactiveTimeForSession(in_session)/1000); } diff --git a/java/org/apache/catalina/manager/util/SessionUtils.java b/java/org/apache/catalina/manager/util/SessionUtils.java index 2e6df33ca..e6398e982 100644 --- a/java/org/apache/catalina/manager/util/SessionUtils.java +++ b/java/org/apache/catalina/manager/util/SessionUtils.java @@ -176,6 +176,9 @@ public class SessionUtils { return in_session.getPrincipal().getName(); } HttpSession httpSession = in_session.getSession(); + if (httpSession == null) + return null; + try { Object user = null; // First search "known locations" diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index a2c2ffa18..733ebe6f1 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -300,6 +300,11 @@ applications that redirect users to the html interface rather than returning a 404. (markt) + + Provide the HTML Manager application with the ability to differentiate + between primary, backup and proxy sessions. Note that proxy sessions are + only shown if enabled in web.xml. (markt) + diff --git a/webapps/manager/WEB-INF/jsp/sessionsList.jsp b/webapps/manager/WEB-INF/jsp/sessionsList.jsp index 5c994a454..d8cdc1e69 100644 --- a/webapps/manager/WEB-INF/jsp/sessionsList.jsp +++ b/webapps/manager/WEB-INF/jsp/sessionsList.jsp @@ -25,7 +25,8 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - + +<%@page import="org.apache.catalina.manager.DummyProxySession"%> <% String path = (String) request.getAttribute("path"); String submitUrl = response.encodeURL(((HttpServletRequest) pageContext.getRequest()).getRequestURI() + "?path=" + path); @@ -107,13 +108,23 @@ } else { type = "Backup"; } + } else if (currentSession instanceof DummyProxySession) { + type = "Proxy"; } else { type = "Primary"; } %> + <% + if ("Proxy".equals(type)) { + out.print(currentSessionId); + } else { + %> <%= JspHelper.escapeXml(currentSessionId) %> + <% + } + %> <%= type %> <%= JspHelper.guessDisplayLocaleFromSession(currentSession) %> diff --git a/webapps/manager/WEB-INF/web.xml b/webapps/manager/WEB-INF/web.xml index 548760468..e23e226d5 100644 --- a/webapps/manager/WEB-INF/web.xml +++ b/webapps/manager/WEB-INF/web.xml @@ -44,6 +44,13 @@ debug 2 + 52428800