cmssessionmanager.java
来自「找了很久才找到到源代码」· Java 代码 · 共 606 行 · 第 1/2 页
JAVA
606 行
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/main/CmsSessionManager.java,v $
* Date : $Date: 2007-08-13 16:29:59 $
* Version: $Revision: 1.14 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.main;
import org.opencms.db.CmsUserSettings;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsRequestContext;
import org.opencms.file.CmsUser;
import org.opencms.security.CmsRole;
import org.opencms.security.CmsSecurityException;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplaceManager;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import org.apache.commons.collections.Buffer;
import org.apache.commons.collections.BufferUtils;
import org.apache.commons.collections.buffer.CircularFifoBuffer;
import org.apache.commons.logging.Log;
/**
* Keeps track of the sessions running on the OpenCms server and
* provides a session info storage which is used to get an overview
* about currently authenticated OpenCms users, as well as sending broadcasts between users.<p>
*
* For each authenticated OpenCms user, a {@link org.opencms.main.CmsSessionInfo} object
* holds the information about the users status.<p>
*
* When a user session is invalidated, the user info will be removed.
* This happens when a user log out, or when his session times out.<p>
*
* <b>Please Note:</b> The current implementation does not provide any permission checking,
* so all users can access the methods of this manager. Permission checking
* based on the current users OpenCms context may be added in a future OpenCms release.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.14 $
*
* @since 6.0.0
*/
public class CmsSessionManager {
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsSessionManager.class);
/** Lock object for synchronized session count updates. */
private Object m_lockSessionCount;
/** Counter for the currently active sessions. */
private int m_sessionCountCurrent;
/** Counter for all sessions created so far. */
private int m_sessionCountTotal;
/** Session storage provider instance. */
private I_CmsSessionStorageProvider m_sessionStorageProvider;
/**
* Creates a new instance of the OpenCms session manager.<p>
*/
protected CmsSessionManager() {
// create a lock object for the session counter
m_lockSessionCount = new Object();
}
/**
* Returns the broadcast queue for the given OpenCms session id.<p>
*
* @param sessionId the OpenCms session id to get the broadcast queue for
*
* @return the broadcast queue for the given OpenCms session id
*/
public Buffer getBroadcastQueue(String sessionId) {
CmsSessionInfo sessionInfo = getSessionInfo(getSessionUUID(sessionId));
if (sessionInfo == null) {
// return empty message buffer if the session is gone or not available
return BufferUtils.synchronizedBuffer(new CircularFifoBuffer(CmsSessionInfo.QUEUE_SIZE));
}
return sessionInfo.getBroadcastQueue();
}
/**
* Returns the number of sessions currently authenticated in the OpenCms security system.<p>
*
* @return the number of sessions currently authenticated in the OpenCms security system
*/
public int getSessionCountAuthenticated() {
// since this method could be called from another thread
// we have to prevent access before initialization
if (m_sessionStorageProvider == null) {
return 0;
}
return m_sessionStorageProvider.getSize();
}
/**
* Returns the number of current sessions, including the sessions of not authenticated guest users.<p>
*
* @return the number of current sessions, including the sessions of not authenticated guest users
*/
public int getSessionCountCurrent() {
return m_sessionCountCurrent;
}
/**
* Returns the number of total sessions generated so far, including already destroyed sessions.<p>
*
* @return the number of total sessions generated so far, including already destroyed sessions
*/
public int getSessionCountTotal() {
return m_sessionCountTotal;
}
/**
* Returns the complete user session info of a user from the session storage,
* or <code>null</code> if this session id has no session info attached.<p>
*
* @param sessionId the OpenCms session id to return the session info for
*
* @return the complete user session info of a user from the session storage
*/
public CmsSessionInfo getSessionInfo(CmsUUID sessionId) {
// since this method could be called from another thread
// we have to prevent access before initialization
if (m_sessionStorageProvider == null) {
return null;
}
return m_sessionStorageProvider.get(sessionId);
}
/**
* Returns the OpenCms user session info for the given request,
* or <code>null</code> if no user session is available.<p>
*
* @param req the current request
*
* @return the OpenCms user session info for the given request, or <code>null</code> if no user session is available
*/
public CmsSessionInfo getSessionInfo(HttpServletRequest req) {
HttpSession session = req.getSession(false);
if (session == null) {
// special case for acessing a session from "outside" requests (e.g. upload applet)
String sessionId = req.getHeader(CmsRequestUtil.HEADER_JSESSIONID);
return sessionId == null ? null : getSessionInfo(sessionId);
}
return getSessionInfo(session);
}
/**
* Returns the OpenCms user session info for the given http session,
* or <code>null</code> if no user session is available.<p>
*
* @param session the current http session
*
* @return the OpenCms user session info for the given http session, or <code>null</code> if no user session is available
*/
public CmsSessionInfo getSessionInfo(HttpSession session) {
if (session == null) {
return null;
}
CmsUUID sessionId = (CmsUUID)session.getAttribute(CmsSessionInfo.ATTRIBUTE_SESSION_ID);
return (sessionId == null) ? null : getSessionInfo(sessionId);
}
/**
* Returns the complete user session info of a user from the session storage,
* or <code>null</code> if this session id has no session info attached.<p>
*
* @param sessionId the OpenCms session id to return the session info for,
* this must be a String representation of a {@link CmsUUID}
*
* @return the complete user session info of a user from the session storage
*
* @see #getSessionInfo(CmsUUID)
*/
public CmsSessionInfo getSessionInfo(String sessionId) {
return getSessionInfo(getSessionUUID(sessionId));
}
/**
* Returns all current session info objects.<p>
*
* @return all current session info objects
*/
public List getSessionInfos() {
// since this method could be called from another thread
// we have to prevent access before initialization
if (m_sessionStorageProvider == null) {
return Collections.EMPTY_LIST;
}
return m_sessionStorageProvider.getAll();
}
/**
* Returns a list of all active session info objects for the specified user.<p>
*
* An OpenCms user can have many active sessions.
* This is e.g. possible when two people have logged in to the system using the
* same username. Even one person can have multiple sessions if he
* is logged in to OpenCms with several browser windows at the same time.<p>
*
* @param userId the id of the user
*
* @return a list of all active session info objects for the specified user
*/
public List getSessionInfos(CmsUUID userId) {
// since this method could be called from another thread
// we have to prevent access before initialization
if (m_sessionStorageProvider == null) {
return Collections.EMPTY_LIST;
}
return m_sessionStorageProvider.getAllOfUser(userId);
}
/**
* Sends a broadcast to all sessions of all currently authenticated users.<p>
*
* @param cms the OpenCms user context of the user sending the broadcast
*
* @param message the message to broadcast
*/
public void sendBroadcast(CmsObject cms, String message) {
if (CmsStringUtil.isEmptyOrWhitespaceOnly(message)) {
// don't broadcast empty messages
return;
}
// create the broadcast
CmsBroadcast broadcast = new CmsBroadcast(cms.getRequestContext().currentUser(), message);
// send the broadcast to all authenticated sessions
Iterator i = m_sessionStorageProvider.getAll().iterator();
while (i.hasNext()) {
CmsSessionInfo sessionInfo = (CmsSessionInfo)i.next();
if (m_sessionStorageProvider.get(sessionInfo.getSessionId()) != null) {
// double check for concurrent modification
sessionInfo.getBroadcastQueue().add(broadcast);
}
}
}
/**
* Sends a broadcast to the specified user session.<p>
*
* @param cms the OpenCms user context of the user sending the broadcast
*
* @param message the message to broadcast
* @param sessionId the OpenCms session uuid target (receiver) of the broadcast
*/
public void sendBroadcast(CmsObject cms, String message, String sessionId) {
if (CmsStringUtil.isEmptyOrWhitespaceOnly(message)) {
// don't broadcast empty messages
return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?