Search in sources :

Example 1 with HttpSessionBindingListener

use of jakarta.servlet.http.HttpSessionBindingListener in project tomcat by apache.

the class StandardSession method removeAttributeInternal.

/**
 * Remove the object bound with the specified name from this session.  If
 * the session does not have an object bound with this name, this method
 * does nothing.
 * <p>
 * After this method executes, and if the object implements
 * <code>HttpSessionBindingListener</code>, the container calls
 * <code>valueUnbound()</code> on the object.
 *
 * @param name Name of the object to remove from this session.
 * @param notify Should we notify interested listeners that this
 *  attribute is being removed?
 */
protected void removeAttributeInternal(String name, boolean notify) {
    // Avoid NPE
    if (name == null) {
        return;
    }
    // Remove this attribute from our collection
    Object value = attributes.remove(name);
    // Do we need to do valueUnbound() and attributeRemoved() notification?
    if (!notify || (value == null)) {
        return;
    }
    // Call the valueUnbound() method if necessary
    HttpSessionBindingEvent event = null;
    if (value instanceof HttpSessionBindingListener) {
        event = new HttpSessionBindingEvent(getSession(), name, value);
        ((HttpSessionBindingListener) value).valueUnbound(event);
    }
    // Notify interested application event listeners
    Context context = manager.getContext();
    Object[] listeners = context.getApplicationEventListeners();
    if (listeners == null) {
        return;
    }
    for (Object o : listeners) {
        if (!(o instanceof HttpSessionAttributeListener)) {
            continue;
        }
        HttpSessionAttributeListener listener = (HttpSessionAttributeListener) o;
        try {
            context.fireContainerEvent("beforeSessionAttributeRemoved", listener);
            if (event == null) {
                event = new HttpSessionBindingEvent(getSession(), name, value);
            }
            listener.attributeRemoved(event);
            context.fireContainerEvent("afterSessionAttributeRemoved", listener);
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            try {
                context.fireContainerEvent("afterSessionAttributeRemoved", listener);
            } catch (Exception e) {
            // Ignore
            }
            manager.getContext().getLogger().error(sm.getString("standardSession.attributeEvent"), t);
        }
    }
}
Also used : HttpSessionBindingEvent(jakarta.servlet.http.HttpSessionBindingEvent) Context(org.apache.catalina.Context) ServletContext(jakarta.servlet.ServletContext) HttpSessionBindingListener(jakarta.servlet.http.HttpSessionBindingListener) HttpSessionAttributeListener(jakarta.servlet.http.HttpSessionAttributeListener) IOException(java.io.IOException) NotSerializableException(java.io.NotSerializableException) ObjectStreamException(java.io.ObjectStreamException) WriteAbortedException(java.io.WriteAbortedException)

Example 2 with HttpSessionBindingListener

use of jakarta.servlet.http.HttpSessionBindingListener in project tomcat by apache.

the class StandardSession method setAttribute.

/**
 * Bind an object to this session, using the specified name.  If an object
 * of the same name is already bound to this session, the object is
 * replaced.
 * <p>
 * After this method executes, and if the object implements
 * <code>HttpSessionBindingListener</code>, the container calls
 * <code>valueBound()</code> on the object.
 *
 * @param name Name to which the object is bound, cannot be null
 * @param value Object to be bound, cannot be null
 * @param notify whether to notify session listeners
 * @exception IllegalArgumentException if an attempt is made to add a
 *  non-serializable object in an environment marked distributable.
 * @exception IllegalStateException if this method is called on an
 *  invalidated session
 */
public void setAttribute(String name, Object value, boolean notify) {
    // Name cannot be null
    if (name == null) {
        throw new IllegalArgumentException(sm.getString("standardSession.setAttribute.namenull"));
    }
    // Null value is the same as removeAttribute()
    if (value == null) {
        removeAttribute(name);
        return;
    }
    // Validate our current state
    if (!isValidInternal()) {
        throw new IllegalStateException(sm.getString("standardSession.setAttribute.ise", getIdInternal()));
    }
    Context context = manager.getContext();
    if (context.getDistributable() && !isAttributeDistributable(name, value) && !exclude(name, value)) {
        throw new IllegalArgumentException(sm.getString("standardSession.setAttribute.iae", name));
    }
    // Construct an event with the new value
    HttpSessionBindingEvent event = null;
    // Call the valueBound() method if necessary
    if (notify && value instanceof HttpSessionBindingListener) {
        // Don't call any notification if replacing with the same value
        // unless configured to do so
        Object oldValue = attributes.get(name);
        if (value != oldValue || manager.getNotifyBindingListenerOnUnchangedValue()) {
            event = new HttpSessionBindingEvent(getSession(), name, value);
            try {
                ((HttpSessionBindingListener) value).valueBound(event);
            } catch (Throwable t) {
                manager.getContext().getLogger().error(sm.getString("standardSession.bindingEvent"), t);
            }
        }
    }
    // Replace or add this attribute
    Object unbound = attributes.put(name, value);
    // Call the valueUnbound() method if necessary
    if (notify && unbound instanceof HttpSessionBindingListener) {
        // unless configured to do so
        if (unbound != value || manager.getNotifyBindingListenerOnUnchangedValue()) {
            try {
                ((HttpSessionBindingListener) unbound).valueUnbound(new HttpSessionBindingEvent(getSession(), name));
            } catch (Throwable t) {
                ExceptionUtils.handleThrowable(t);
                manager.getContext().getLogger().error(sm.getString("standardSession.bindingEvent"), t);
            }
        }
    }
    if (!notify) {
        return;
    }
    // Notify interested application event listeners
    Object[] listeners = context.getApplicationEventListeners();
    if (listeners == null) {
        return;
    }
    for (Object o : listeners) {
        if (!(o instanceof HttpSessionAttributeListener)) {
            continue;
        }
        HttpSessionAttributeListener listener = (HttpSessionAttributeListener) o;
        try {
            if (unbound != null) {
                if (unbound != value || manager.getNotifyAttributeListenerOnUnchangedValue()) {
                    context.fireContainerEvent("beforeSessionAttributeReplaced", listener);
                    if (event == null) {
                        event = new HttpSessionBindingEvent(getSession(), name, unbound);
                    }
                    listener.attributeReplaced(event);
                    context.fireContainerEvent("afterSessionAttributeReplaced", listener);
                }
            } else {
                context.fireContainerEvent("beforeSessionAttributeAdded", listener);
                if (event == null) {
                    event = new HttpSessionBindingEvent(getSession(), name, value);
                }
                listener.attributeAdded(event);
                context.fireContainerEvent("afterSessionAttributeAdded", listener);
            }
        } catch (Throwable t) {
            ExceptionUtils.handleThrowable(t);
            try {
                if (unbound != null) {
                    if (unbound != value || manager.getNotifyAttributeListenerOnUnchangedValue()) {
                        context.fireContainerEvent("afterSessionAttributeReplaced", listener);
                    }
                } else {
                    context.fireContainerEvent("afterSessionAttributeAdded", listener);
                }
            } catch (Exception e) {
            // Ignore
            }
            manager.getContext().getLogger().error(sm.getString("standardSession.attributeEvent"), t);
        }
    }
}
Also used : Context(org.apache.catalina.Context) ServletContext(jakarta.servlet.ServletContext) HttpSessionBindingEvent(jakarta.servlet.http.HttpSessionBindingEvent) HttpSessionBindingListener(jakarta.servlet.http.HttpSessionBindingListener) HttpSessionAttributeListener(jakarta.servlet.http.HttpSessionAttributeListener) IOException(java.io.IOException) NotSerializableException(java.io.NotSerializableException) ObjectStreamException(java.io.ObjectStreamException) WriteAbortedException(java.io.WriteAbortedException)

Example 3 with HttpSessionBindingListener

use of jakarta.servlet.http.HttpSessionBindingListener in project spring-framework by spring-projects.

the class MockHttpSession method clearAttributes.

/**
 * Clear all of this session's attributes.
 */
public void clearAttributes() {
    for (Iterator<Map.Entry<String, Object>> it = this.attributes.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<String, Object> entry = it.next();
        String name = entry.getKey();
        Object value = entry.getValue();
        it.remove();
        if (value instanceof HttpSessionBindingListener) {
            ((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value));
        }
    }
}
Also used : HttpSessionBindingEvent(jakarta.servlet.http.HttpSessionBindingEvent) HttpSessionBindingListener(jakarta.servlet.http.HttpSessionBindingListener) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 4 with HttpSessionBindingListener

use of jakarta.servlet.http.HttpSessionBindingListener in project spring-framework by spring-projects.

the class MockHttpSession method serializeState.

/**
 * Serialize the attributes of this session into an object that can be
 * turned into a byte array with standard Java serialization.
 * @return a representation of this session's serialized state
 */
public Serializable serializeState() {
    HashMap<String, Serializable> state = new HashMap<>();
    for (Iterator<Map.Entry<String, Object>> it = this.attributes.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<String, Object> entry = it.next();
        String name = entry.getKey();
        Object value = entry.getValue();
        it.remove();
        if (value instanceof Serializable) {
            state.put(name, (Serializable) value);
        } else {
            // unbind the attribute in this case.
            if (value instanceof HttpSessionBindingListener) {
                ((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value));
            }
        }
    }
    return state;
}
Also used : HttpSessionBindingEvent(jakarta.servlet.http.HttpSessionBindingEvent) Serializable(java.io.Serializable) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) HttpSessionBindingListener(jakarta.servlet.http.HttpSessionBindingListener) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 5 with HttpSessionBindingListener

use of jakarta.servlet.http.HttpSessionBindingListener in project spring-framework by spring-projects.

the class MockHttpSession method removeAttribute.

@Override
public void removeAttribute(String name) {
    assertIsValid();
    Assert.notNull(name, "Attribute name must not be null");
    Object value = this.attributes.remove(name);
    if (value instanceof HttpSessionBindingListener) {
        ((HttpSessionBindingListener) value).valueUnbound(new HttpSessionBindingEvent(this, name, value));
    }
}
Also used : HttpSessionBindingEvent(jakarta.servlet.http.HttpSessionBindingEvent) HttpSessionBindingListener(jakarta.servlet.http.HttpSessionBindingListener)

Aggregations

HttpSessionBindingEvent (jakarta.servlet.http.HttpSessionBindingEvent)10 HttpSessionBindingListener (jakarta.servlet.http.HttpSessionBindingListener)10 HashMap (java.util.HashMap)4 LinkedHashMap (java.util.LinkedHashMap)4 Map (java.util.Map)4 ServletContext (jakarta.servlet.ServletContext)2 HttpSessionAttributeListener (jakarta.servlet.http.HttpSessionAttributeListener)2 IOException (java.io.IOException)2 NotSerializableException (java.io.NotSerializableException)2 ObjectStreamException (java.io.ObjectStreamException)2 Serializable (java.io.Serializable)2 WriteAbortedException (java.io.WriteAbortedException)2 Context (org.apache.catalina.Context)2