浏览代码

HttpSessionEventPublisher, HttpSessionCreatedEvent, HttpSessionDestroyedEvent
Used together to provide published events in the ApplicationContext about HttpSessions.

Useful for things like Single Session logins.

Ray Krueger 20 年之前
父节点
当前提交
3c4faf58c7

+ 50 - 0
core/src/main/java/org/acegisecurity/ui/session/HttpSessionApplicationEvent.java

@@ -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();
+    }
+}

+ 33 - 0
core/src/main/java/org/acegisecurity/ui/session/HttpSessionCreatedEvent.java

@@ -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);
+    }
+}

+ 33 - 0
core/src/main/java/org/acegisecurity/ui/session/HttpSessionDestroyedEvent.java

@@ -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);
+    }
+}

+ 117 - 0
core/src/main/java/org/acegisecurity/ui/session/HttpSessionEventPublisher.java

@@ -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);
+    }
+}

+ 77 - 0
core/src/test/java/org/acegisecurity/ui/session/HttpSessionEventPublisherTests.java

@@ -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));
+    }
+}

+ 58 - 0
core/src/test/java/org/acegisecurity/ui/session/TestListener.java

@@ -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;
+        }
+    }
+}

+ 5 - 1
samples/contacts/src/main/webapp/filter/WEB-INF/web.xml

@@ -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.
     -->