| 
					
				 | 
			
			
				@@ -30,6 +30,7 @@ import org.springframework.security.context.SecurityContextHolder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.logging.Log;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.logging.LogFactory;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.util.Assert;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.util.StringUtils;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /**
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Logs a principal out.
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -64,7 +65,6 @@ public class LogoutFilter extends SpringSecurityFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     //~ Constructors ===================================================================================================
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public LogoutFilter(String logoutSuccessUrl, LogoutHandler[] handlers) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Assert.hasText(logoutSuccessUrl, "LogoutSuccessUrl required");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Assert.notEmpty(handlers, "LogoutHandlers are required");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.logoutSuccessUrl = logoutSuccessUrl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this.handlers = handlers;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -86,7 +86,9 @@ public class LogoutFilter extends SpringSecurityFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 handlers[i].logout(request, response, auth);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sendRedirect(request, response, logoutSuccessUrl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String targetUrl = determineTargetUrl(request, response);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sendRedirect(request, response, targetUrl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -125,6 +127,32 @@ public class LogoutFilter extends SpringSecurityFilter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return uri.endsWith(request.getContextPath() + filterProcessesUrl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /**
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * Returns the target URL to redirect to after logout.
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * <p>
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * By default it will check for a <tt>logoutSuccessUrl</tt> parameter in
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * the request and use this. If that isn't present it will use the configured <tt>logoutSuccessUrl</tt>. If this
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * hasn't been set it will check the Referer header and use the URL from there.
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String targetUrl = request.getParameter("logoutSuccessUrl");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(!StringUtils.hasLength(targetUrl)) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            targetUrl = logoutSuccessUrl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!StringUtils.hasLength(targetUrl)) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            targetUrl = request.getHeader("Referer");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }        
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!StringUtils.hasLength(targetUrl)) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            targetUrl = "/";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return targetUrl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /**
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * Allow subclasses to modify the redirection message.
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      *
 
			 |