|  | @@ -153,6 +153,8 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private RememberMeServices rememberMeServices = new NullRememberMeServices();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private TargetUrlResolver targetUrlResolver = new TargetUrlResolverImpl();
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      /** Where to redirect the browser to if authentication fails */
 | 
	
		
			
				|  |  |      private String authenticationFailureUrl;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -216,7 +218,8 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |          Assert.hasLength(defaultTargetUrl, "defaultTargetUrl must be specified");
 | 
	
		
			
				|  |  |          Assert.hasLength(authenticationFailureUrl, "authenticationFailureUrl must be specified");
 | 
	
		
			
				|  |  |          Assert.notNull(authenticationManager, "authenticationManager must be specified");
 | 
	
		
			
				|  |  | -        Assert.notNull(this.rememberMeServices);
 | 
	
		
			
				|  |  | +        Assert.notNull(rememberMeServices, "rememberMeServices cannot be null");
 | 
	
		
			
				|  |  | +        Assert.notNull(targetUrlResolver, "targetUrlResolver cannot be null");
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -266,6 +269,12 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public static String obtainFullSavedRequestUrl(HttpServletRequest request) {
 | 
	
		
			
				|  |  | +    	SavedRequest savedRequest = getSavedRequest(request);
 | 
	
		
			
				|  |  | +    	
 | 
	
		
			
				|  |  | +        return savedRequest == null ? null : savedRequest.getFullRequestUrl();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private static SavedRequest getSavedRequest(HttpServletRequest request) {
 | 
	
		
			
				|  |  |          HttpSession session = request.getSession(false);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (session == null) {
 | 
	
	
		
			
				|  | @@ -274,9 +283,9 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          SavedRequest savedRequest = (SavedRequest) session.getAttribute(SPRING_SECURITY_SAVED_REQUEST_KEY);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        return savedRequest == null ? null : savedRequest.getFullRequestUrl();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +		return savedRequest;
 | 
	
		
			
				|  |  | + 	}
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      protected void onPreAuthentication(HttpServletRequest request, HttpServletResponse response)
 | 
	
		
			
				|  |  |              throws AuthenticationException, IOException {
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -416,9 +425,9 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      protected String determineTargetUrl(HttpServletRequest request) {
 | 
	
		
			
				|  |  | -        // Don't attempt to obtain the url from the saved request if
 | 
	
		
			
				|  |  | -        // alwaysUsedefaultTargetUrl is set
 | 
	
		
			
				|  |  | -        String targetUrl = alwaysUseDefaultTargetUrl ? null : obtainFullSavedRequestUrl(request);
 | 
	
		
			
				|  |  | +        // Don't attempt to obtain the url from the saved request if alwaysUsedefaultTargetUrl is set
 | 
	
		
			
				|  |  | +    	String targetUrl = alwaysUseDefaultTargetUrl ? null : 
 | 
	
		
			
				|  |  | +    		targetUrlResolver.determineTargetUrl(getSavedRequest(request), request, SecurityContextHolder.getContext().getAuthentication());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (targetUrl == null) {
 | 
	
		
			
				|  |  |              targetUrl = getDefaultTargetUrl();
 | 
	
	
		
			
				|  | @@ -578,4 +587,18 @@ public abstract class AbstractProcessingFilter extends SpringSecurityFilter impl
 | 
	
		
			
				|  |  |      public void setAllowSessionCreation(boolean allowSessionCreation) {
 | 
	
		
			
				|  |  |          this.allowSessionCreation = allowSessionCreation;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/**
 | 
	
		
			
				|  |  | +	 * @return the targetUrlResolver
 | 
	
		
			
				|  |  | +	 */
 | 
	
		
			
				|  |  | +	protected TargetUrlResolver getTargetUrlResolver() {
 | 
	
		
			
				|  |  | +		return targetUrlResolver;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/**
 | 
	
		
			
				|  |  | +	 * @param targetUrlResolver the targetUrlResolver to set
 | 
	
		
			
				|  |  | +	 */
 | 
	
		
			
				|  |  | +	public void setTargetUrlResolver(TargetUrlResolver targetUrlResolver) {
 | 
	
		
			
				|  |  | +		this.targetUrlResolver = targetUrlResolver;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 |