/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you 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 the following location:
*
* 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 org.jasig.cas.web.flow;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
/**
* Abstract logout action, which prevents caching on logout.
*
* @author Jerome Leleu
* @since 4.0.0
*/
public abstract class AbstractLogoutAction extends AbstractAction {
/** A constant for the logout index in web flow. */
public static final String LOGOUT_INDEX = "logoutIndex";
/** The finish event in webflow. */
public static final String FINISH_EVENT = "finish";
/** The front event in webflow. */
public static final String FRONT_EVENT = "front";
/** The redirect to app event in webflow. */
public static final String REDIRECT_APP_EVENT = "redirectApp";
@Override
protected final Event doExecute(final RequestContext context) throws Exception {
final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
final HttpServletResponse response = WebUtils.getHttpServletResponse(context);
preventCaching(response);
return doInternalExecute(request, response, context);
}
/**
* Execute the logout action after invalidating the cache.
*
* @param request the HTTP request.
* @param response the HTTP response.
* @param context the webflow context.
* @return the event triggered by this actions.
* @throws Exception exception returned by this action.
*/
protected abstract Event doInternalExecute(final HttpServletRequest request, final HttpServletResponse response,
final RequestContext context) throws Exception;
/**
* Prevent caching by adding the appropriate headers.
* Copied from the <code>preventCaching</code> method in the {@link WebContentGenerator} class.
*
* @param response the HTTP response.
*/
protected final void preventCaching(final HttpServletResponse response) {
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 1L);
response.setHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "no-store");
}
protected final void putLogoutIndex(final RequestContext context, final int index) {
context.getFlowScope().put(LOGOUT_INDEX, index);
}
protected final int getLogoutIndex(final RequestContext context) {
final Object value = context.getFlowScope().get(LOGOUT_INDEX);
return value == null ? 0 : (Integer) value;
}
}