HttpSessionEventPublisher, HttpSessionCreatedEvent, HttpSessionDestroyedEvent

Used together to provide published events in the ApplicationContext about HttpSessions.

Useful for things like Single Session logins.
This commit is contained in:
Ray Krueger 2005-02-23 02:54:41 +00:00
parent 8b24b1cf7a
commit 3c4faf58c7
7 changed files with 373 additions and 1 deletions

View File

@ -0,0 +1,50 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import org.springframework.context.ApplicationEvent;
import javax.servlet.http.HttpSession;
/**
* Parent class for published HttpSession events
*
* @author Ray Krueger
*/
public abstract class HttpSessionApplicationEvent extends ApplicationEvent {
//~ Constructors ===========================================================
/**
* Base constructor for all subclasses must have an HttpSession
*
* @param httpSession The session to carry as the event source.
*/
public HttpSessionApplicationEvent(HttpSession httpSession) {
super(httpSession);
}
//~ Methods ================================================================
/**
* Get the HttpSession that is the cause of the event
*
* @return HttpSession instance
*/
public HttpSession getSession() {
return (HttpSession) getSource();
}
}

View File

@ -0,0 +1,33 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import javax.servlet.http.HttpSession;
/**
* Published by the {@link HttpSessionEventPublisher} when a HttpSession is
* destroyed by the container
*
* @author Ray Krueger
*/
public class HttpSessionCreatedEvent extends HttpSessionApplicationEvent {
//~ Constructors ===========================================================
public HttpSessionCreatedEvent(HttpSession o) {
super(o);
}
}

View File

@ -0,0 +1,33 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import javax.servlet.http.HttpSession;
/**
* Published by the {@link HttpSessionEventPublisher} when a HttpSession is
* created in the container
*
* @author Ray Krueger
*/
public class HttpSessionDestroyedEvent extends HttpSessionApplicationEvent {
//~ Constructors ===========================================================
public HttpSessionDestroyedEvent(HttpSession o) {
super(o);
}
}

View File

@ -0,0 +1,117 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* Declared in web.xml as <br>
* <code> &lt;listener&gt;<br>
* &lt;listener-class&gt;net.sf.acegisecurity.ui.session.HttpSessionEventPublisher&lt;/listener-class&gt;<br>
* &lt;/listener&gt;<br>
* </code> Publishes <code>HttpSessionApplicationEvent</code>s to the Spring
* Root WebApplicationContext. <br>
* Maps javax.servlet.http.HttpSessionListener.sessionCreated() to {@link
* HttpSessionCreatedEvent}. <br>
* Maps javax.servlet.http.HttpSessionListener.sessionDestroyed() to {@link
* HttpSessionDestroyedEvent}. <br>
*
* @author Ray Krueger
*/
public class HttpSessionEventPublisher implements HttpSessionListener,
ServletContextListener {
//~ Static fields/initializers =============================================
private static final Log log = LogFactory.getLog(HttpSessionEventPublisher.class);
//~ Instance fields ========================================================
private ApplicationContext context;
//~ Methods ================================================================
/**
* Not implemented
*
* @param event
*/
public void contextDestroyed(ServletContextEvent event) {}
/**
* Handled internally by a call to {@link
* org.springframework.web.context.support.WebApplicationContextUtils#getRequiredWebApplicationContext(javax.servlet.ServletContext)}
*
* @param event the ServletContextEvent passed in by the container,
* event.getServletContext() will be used to get the
* WebApplicationContext
*/
public void contextInitialized(ServletContextEvent event) {
setContext(WebApplicationContextUtils.getRequiredWebApplicationContext(
event.getServletContext()));
}
/**
* Handles the HttpSessionEvent by publishing a {@link
* HttpSessionCreatedEvent} to the application context.
*
* @param event HttpSessionEvent passed in by the container
*/
public void sessionCreated(HttpSessionEvent event) {
HttpSessionCreatedEvent e = new HttpSessionCreatedEvent(event
.getSession());
log.debug("Publishing event: " + e);
context.publishEvent(e);
}
/**
* Handles the HttpSessionEvent by publishing a {@link
* HttpSessionDestroyedEvent} to the application context.
*
* @param event The HttpSessionEvent pass in by the container
*/
public void sessionDestroyed(HttpSessionEvent event) {
HttpSessionDestroyedEvent e = new HttpSessionDestroyedEvent(event
.getSession());
log.debug("Publishing event: " + e);
context.publishEvent(e);
}
/**
* Package level method for testing and internal usage
*
* @param context The ApplicationContext this class will use to publish
* events
*/
void setContext(ApplicationContext context) {
this.context = context;
log.debug("Using context: " + context);
}
}

View File

@ -0,0 +1,77 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import junit.framework.TestCase;
import net.sf.acegisecurity.MockHttpSession;
import org.springframework.mock.web.MockServletContext;
import org.springframework.web.context.support.StaticWebApplicationContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpSessionEvent;
/**
* The HttpSessionEventPublisher tests
*
* @author Ray Krueger
*/
public class HttpSessionEventPublisherTests extends TestCase {
//~ Methods ================================================================
/**
* It's not that complicated so we'll just run it straight through here.
* @throws Exception
*/
public void testPublisher() throws Exception {
HttpSessionEventPublisher publisher = new HttpSessionEventPublisher();
StaticWebApplicationContext context = new StaticWebApplicationContext();
MockServletContext servletContext = new MockServletContext();
servletContext.setAttribute(StaticWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
context);
context.setServletContext(servletContext);
context.registerSingleton("listener", TestListener.class, null);
context.refresh();
publisher.contextInitialized(new ServletContextEvent(servletContext));
MockHttpSession session = new MockHttpSession();
TestListener listener = (TestListener) context.getBean("listener");
HttpSessionEvent event = new HttpSessionEvent(session);
publisher.sessionCreated(event);
assertNotNull(listener.getCreatedEvent());
assertNull(listener.getDestroyedEvent());
assertEquals(session, listener.getCreatedEvent().getSession());
listener.setCreatedEvent(null);
listener.setDestroyedEvent(null);
publisher.sessionDestroyed(event);
assertNotNull(listener.getDestroyedEvent());
assertNull(listener.getCreatedEvent());
assertEquals(session, listener.getDestroyedEvent().getSession());
publisher.contextDestroyed(new ServletContextEvent(servletContext));
}
}

View File

@ -0,0 +1,58 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.ui.session;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
/**
* Listener for tests
*
* @author Ray Krueger
*/
public class TestListener implements ApplicationListener {
//~ Instance fields ========================================================
private HttpSessionCreatedEvent createdEvent;
private HttpSessionDestroyedEvent destroyedEvent;
//~ Methods ================================================================
public void setCreatedEvent(HttpSessionCreatedEvent createdEvent) {
this.createdEvent = createdEvent;
}
public HttpSessionCreatedEvent getCreatedEvent() {
return createdEvent;
}
public void setDestroyedEvent(HttpSessionDestroyedEvent destroyedEvent) {
this.destroyedEvent = destroyedEvent;
}
public HttpSessionDestroyedEvent getDestroyedEvent() {
return destroyedEvent;
}
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof HttpSessionCreatedEvent) {
createdEvent = (HttpSessionCreatedEvent) event;
} else if (event instanceof HttpSessionDestroyedEvent) {
destroyedEvent = (HttpSessionDestroyedEvent) event;
}
}
}

View File

@ -57,7 +57,11 @@
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>net.sf.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>
</listener>
<!--
- Provides core MVC application controller. See contacts-servlet.xml.
-->