org.springframework.web.servlet.resource
Class ResourceHttpRequestHandler

java.lang.Object
  extended by org.springframework.context.support.ApplicationObjectSupport
      extended by org.springframework.web.context.support.WebApplicationObjectSupport
          extended by org.springframework.web.servlet.support.WebContentGenerator
              extended by org.springframework.web.servlet.resource.ResourceHttpRequestHandler
All Implemented Interfaces:
ApplicationContextAware, ServletContextAware, HttpRequestHandler

public class ResourceHttpRequestHandler
extends WebContentGenerator
implements HttpRequestHandler

HttpRequestHandler that serves static resources optimized for superior browser performance (according to the guidelines of Page Speed, YSlow, etc.) by allowing for flexible cache settings ("cacheSeconds" property, last-modified support).

The "locations" property takes a list of Spring Resource locations from which static resources are allowed to be served by this handler. For a given request, the list of locations will be consulted in order for the presence of the requested resource, and the first found match will be written to the response, with Expires and Cache-Control headers set as configured. The handler also properly evaluates the Last-Modified header (if present) so that a 304 status code will be returned as appropriate, avoiding unnecessary overhead for resources that are already cached by the client. The use of Resource locations allows resource requests to easily be mapped to locations other than the web application root. For example, resources could be served from a classpath location such as "classpath:/META-INF/public-web-resources/", allowing convenient packaging and serving of resources such as a JavaScript library from within jar files.

To ensure that users with a primed browser cache get the latest changes to application-specific resources upon deployment of new versions of the application, it is recommended that a version string is used in the URL mapping pattern that selects this handler. Such patterns can be easily parameterized using Spring EL. See the reference manual for further examples of this approach.

Rather than being directly configured as a bean, this handler will typically be configured through use of the <mvc:resources/> XML configuration element.

Since:
3.0.4
Author:
Keith Donald, Jeremy Grelle, Juergen Hoeller

Field Summary
 
Fields inherited from class org.springframework.web.servlet.support.WebContentGenerator
METHOD_GET, METHOD_HEAD, METHOD_POST
 
Fields inherited from class org.springframework.context.support.ApplicationObjectSupport
logger
 
Constructor Summary
ResourceHttpRequestHandler()
           
 
Method Summary
protected  MediaType getMediaType(Resource resource)
          Determine an appropriate media type for the given resource.
protected  Resource getResource(HttpServletRequest request)
           
 void handleRequest(HttpServletRequest request, HttpServletResponse response)
          Processes a resource request.
protected  boolean isInvalidPath(String path)
          Validates the given path: returns true if the given path is not a valid resource path.
protected  void setHeaders(HttpServletResponse response, Resource resource, MediaType mediaType)
          Set headers on the given servlet response.
 void setLocations(List<Resource> locations)
          Set a List of Resource paths to use as sources for serving static resources.
protected  void writeContent(HttpServletResponse response, Resource resource)
          Write the actual content out to the given servlet response, streaming the resource's content.
 
Methods inherited from class org.springframework.web.servlet.support.WebContentGenerator
applyCacheSeconds, applyCacheSeconds, cacheForSeconds, cacheForSeconds, checkAndPrepare, checkAndPrepare, getCacheSeconds, getSupportedMethods, isRequireSession, isUseCacheControlHeader, isUseCacheControlNoStore, isUseExpiresHeader, preventCaching, setCacheSeconds, setRequireSession, setSupportedMethods, setUseCacheControlHeader, setUseCacheControlNoStore, setUseExpiresHeader
 
Methods inherited from class org.springframework.web.context.support.WebApplicationObjectSupport
getServletContext, getTempDir, getWebApplicationContext, initApplicationContext, initServletContext, isContextRequired, setServletContext
 
Methods inherited from class org.springframework.context.support.ApplicationObjectSupport
getApplicationContext, getMessageSourceAccessor, initApplicationContext, requiredContextClass, setApplicationContext
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ResourceHttpRequestHandler

public ResourceHttpRequestHandler()
Method Detail

setLocations

public void setLocations(List<Resource> locations)
Set a List of Resource paths to use as sources for serving static resources.


handleRequest

public void handleRequest(HttpServletRequest request,
                          HttpServletResponse response)
                   throws ServletException,
                          IOException
Processes a resource request.

Checks for the existence of the requested resource in the configured list of locations. If the resource does not exist, a 404 response will be returned to the client. If the resource exists, the request will be checked for the presence of the Last-Modified header, and its value will be compared against the last-modified timestamp of the given resource, returning a 304 status code if the Last-Modified value is greater. If the resource is newer than the Last-Modified value, or the header is not present, the content resource of the resource will be written to the response with caching headers set to expire one year in the future.

Specified by:
handleRequest in interface HttpRequestHandler
Parameters:
request - current HTTP request
response - current HTTP response
Throws:
ServletException - in case of general errors
IOException - in case of I/O errors

getResource

protected Resource getResource(HttpServletRequest request)

isInvalidPath

protected boolean isInvalidPath(String path)
Validates the given path: returns true if the given path is not a valid resource path.

The default implementation rejects paths containing "WEB-INF" or "META-INF" as well as paths with relative paths ("../") that result in access of a parent directory.

Parameters:
path - the path to validate
Returns:
true if the path has been recognized as invalid, false otherwise

getMediaType

protected MediaType getMediaType(Resource resource)
Determine an appropriate media type for the given resource.

Parameters:
resource - the resource to check
Returns:
the corresponding media type, or null if none found

setHeaders

protected void setHeaders(HttpServletResponse response,
                          Resource resource,
                          MediaType mediaType)
                   throws IOException
Set headers on the given servlet response. Called for GET requests as well as HEAD requests.

Parameters:
response - current servlet response
resource - the identified resource (never null)
mediaType - the resource's media type (never null)
Throws:
IOException - in case of errors while setting the headers

writeContent

protected void writeContent(HttpServletResponse response,
                            Resource resource)
                     throws IOException
Write the actual content out to the given servlet response, streaming the resource's content.

Parameters:
response - current servlet response
resource - the identified resource (never null)
Throws:
IOException - in case of errors while writing the content