org.springframework.security.web.util
Class MediaTypeRequestMatcher

java.lang.Object
  extended by org.springframework.security.web.util.MediaTypeRequestMatcher
All Implemented Interfaces:
RequestMatcher

public final class MediaTypeRequestMatcher
extends Object
implements RequestMatcher

Allows matching HttpServletRequest based upon the MediaType's resolved from a ContentNegotiationStrategy. By default, the matching process will perform the following:

For example, consider the following example
 GET /
 Accept: application/json

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 assert matcher.matches(request) == true // returns true
 
The following will also return true
 GET /
 Accept: */*

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 assert matcher.matches(request) == true // returns true
 

Ignoring Media Types

Sometimes you may want to ignore certain types of media types. For example, you may want to match on "application/json" but ignore "*/" sent by a web browser.
 GET /
 Accept: */*

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 matcher.setIgnoredMediaTypes(Collections.singleton(MediaType.ALL));
 assert matcher.matches(request) == false // returns false
 
 GET /
 Accept: application/json

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 matcher.setIgnoredMediaTypes(Collections.singleton(MediaType.ALL));
 assert matcher.matches(request) == true // returns true
 

Exact media type comparison

By default as long as the MediaType discovered by ContentNegotiationStrategy returns true for MediaType.isCompatibleWith(MediaType) on the matchingMediaTypes, the result of the match is true. However, sometimes you may want to perform an exact match. This can be done with the following examples:
 GET /
 Accept: application/json

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 matcher.setUseEquals(true);
 assert matcher.matches(request) == true // returns true
 
 GET /
 Accept: application/*

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 matcher.setUseEquals(true);
 assert matcher.matches(request) == false // returns false
 
 GET /
 Accept: */*

 ContentNegotiationStrategy negotiationStrategy = new HeaderContentNegotiationStrategy()
 MediaTypeRequestMatcher matcher = new MediaTypeRequestMatcher(negotiationStrategy, MediaType.APPLICATION_JSON);
 matcher.setUseEquals(true);
 assert matcher.matches(request) == false // returns false
 

Since:
3.2

Constructor Summary
MediaTypeRequestMatcher(org.springframework.web.accept.ContentNegotiationStrategy contentNegotiationStrategy, Collection<MediaType> matchingMediaTypes)
          Creates an instance
MediaTypeRequestMatcher(org.springframework.web.accept.ContentNegotiationStrategy contentNegotiationStrategy, MediaType... matchingMediaTypes)
          Creates an instance
 
Method Summary
 boolean matches(javax.servlet.http.HttpServletRequest request)
          Decides whether the rule implemented by the strategy matches the supplied request.
 void setIgnoredMediaTypes(Set<MediaType> ignoredMediaTypes)
          Set the MediaType to ignore from the ContentNegotiationStrategy.
 void setUseEquals(boolean useEquals)
          If set to true, matches on exact MediaType, else uses MediaType.isCompatibleWith(MediaType).
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

MediaTypeRequestMatcher

public MediaTypeRequestMatcher(org.springframework.web.accept.ContentNegotiationStrategy contentNegotiationStrategy,
                               MediaType... matchingMediaTypes)
Creates an instance

Parameters:
contentNegotiationStrategy - the ContentNegotiationStrategy to use
matchingMediaTypes - the MediaType that will make the RequestMatcher return true

MediaTypeRequestMatcher

public MediaTypeRequestMatcher(org.springframework.web.accept.ContentNegotiationStrategy contentNegotiationStrategy,
                               Collection<MediaType> matchingMediaTypes)
Creates an instance

Parameters:
contentNegotiationStrategy - the ContentNegotiationStrategy to use
matchingMediaTypes - the MediaType that will make the RequestMatcher return true
Method Detail

matches

public boolean matches(javax.servlet.http.HttpServletRequest request)
Description copied from interface: RequestMatcher
Decides whether the rule implemented by the strategy matches the supplied request.

Specified by:
matches in interface RequestMatcher
Parameters:
request - the request to check for a match
Returns:
true if the request matches, false otherwise

setUseEquals

public void setUseEquals(boolean useEquals)
If set to true, matches on exact MediaType, else uses MediaType.isCompatibleWith(MediaType).

Parameters:
useEquals - specify if equals comparison should be used.

setIgnoredMediaTypes

public void setIgnoredMediaTypes(Set<MediaType> ignoredMediaTypes)
Set the MediaType to ignore from the ContentNegotiationStrategy. This is useful if for example, you want to match on MediaType.APPLICATION_JSON but want to ignore MediaType.ALL.

Parameters:
ignoredMediaTypes - the MediaType's to ignore from the ContentNegotiationStrategy