public class ResourceWebHandler extends Object implements org.springframework.web.server.WebHandler, org.springframework.beans.factory.InitializingBean, org.springframework.beans.factory.SmartInitializingSingleton
HttpRequestHandler
that serves static resources in an optimized way
according to the guidelines of Page Speed, YSlow, etc.
The "locations" property takes a list of Spring
Resource
locations from which static resources are allowed to
be served by this handler. Resources could be served from a classpath location,
e.g. "classpath:/META-INF/public-web-resources/", allowing convenient packaging
and serving of resources such as .js, .css, and others in jar files.
This request handler may also be configured with a
resourcesResolver
and
resourceTransformer
chains to support
arbitrary resolution and transformation of resources being served. By default a
PathResourceResolver
simply finds resources based on the configured
"locations". An application can configure additional resolvers and
transformers such as the VersionResourceResolver
which can resolve
and prepare URLs for resources with a version in the URL.
This 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.
Constructor and Description |
---|
ResourceWebHandler() |
Modifier and Type | Method and Description |
---|---|
void |
afterPropertiesSet() |
void |
afterSingletonsInstantiated() |
org.springframework.http.CacheControl |
getCacheControl() |
CompositeContentTypeResolver |
getContentTypeResolver()
Return the configured
CompositeContentTypeResolver . |
List<org.springframework.core.io.Resource> |
getLocations()
Return the
List of Resource paths to use as sources
for serving static resources. |
protected org.springframework.http.MediaType |
getMediaType(org.springframework.web.server.ServerWebExchange exchange,
org.springframework.core.io.Resource resource)
Determine the media type for the given request and the resource matched
to it.
|
protected reactor.core.publisher.Mono<org.springframework.core.io.Resource> |
getResource(org.springframework.web.server.ServerWebExchange exchange) |
org.springframework.http.codec.ResourceHttpMessageWriter |
getResourceHttpMessageWriter()
Return the configured resource message writer.
|
List<ResourceResolver> |
getResourceResolvers()
Return the list of configured resource resolvers.
|
List<ResourceTransformer> |
getResourceTransformers()
Return the list of configured resource transformers.
|
reactor.core.publisher.Mono<Void> |
handle(org.springframework.web.server.ServerWebExchange exchange)
Processes a resource request.
|
protected void |
initAllowedLocations()
Look for a
PathResourceResolver among the configured resource
resolvers and set its allowedLocations property (if empty) to
match the locations configured on this class. |
protected PathExtensionContentTypeResolver |
initContentNegotiationStrategy() |
protected boolean |
isInvalidPath(String path)
Identifies invalid resource paths.
|
protected String |
processPath(String path)
Process the given resource path to be used.
|
void |
setCacheControl(org.springframework.http.CacheControl cacheControl)
Set the
CacheControl instance to build
the Cache-Control HTTP response header. |
void |
setContentTypeResolver(CompositeContentTypeResolver contentTypeResolver)
Configure a
CompositeContentTypeResolver to help determine the
media types for resources being served. |
protected void |
setHeaders(org.springframework.web.server.ServerWebExchange exchange,
org.springframework.core.io.Resource resource,
org.springframework.http.MediaType mediaType)
Set headers on the response.
|
void |
setLocations(List<org.springframework.core.io.Resource> locations)
Set the
List of Resource paths to use as sources
for serving static resources. |
void |
setResourceHttpMessageWriter(org.springframework.http.codec.ResourceHttpMessageWriter httpMessageWriter)
Configure the
ResourceHttpMessageWriter to use. |
void |
setResourceResolvers(List<ResourceResolver> resourceResolvers)
Configure the list of
ResourceResolver s to use. |
void |
setResourceTransformers(List<ResourceTransformer> resourceTransformers)
Configure the list of
ResourceTransformer s to use. |
String |
toString() |
public void setLocations(List<org.springframework.core.io.Resource> locations)
List
of Resource
paths to use as sources
for serving static resources.public List<org.springframework.core.io.Resource> getLocations()
List
of Resource
paths to use as sources
for serving static resources.public void setResourceResolvers(List<ResourceResolver> resourceResolvers)
ResourceResolver
s to use.
By default PathResourceResolver
is configured. If using this property,
it is recommended to add PathResourceResolver
as the last resolver.
public List<ResourceResolver> getResourceResolvers()
public void setResourceTransformers(List<ResourceTransformer> resourceTransformers)
ResourceTransformer
s to use.
By default no transformers are configured for use.
public List<ResourceTransformer> getResourceTransformers()
public void setCacheControl(org.springframework.http.CacheControl cacheControl)
CacheControl
instance to build
the Cache-Control HTTP response header.public org.springframework.http.CacheControl getCacheControl()
public void setResourceHttpMessageWriter(org.springframework.http.codec.ResourceHttpMessageWriter httpMessageWriter)
ResourceHttpMessageWriter
to use.
By default a ResourceHttpMessageWriter
will be configured.
public org.springframework.http.codec.ResourceHttpMessageWriter getResourceHttpMessageWriter()
public void setContentTypeResolver(CompositeContentTypeResolver contentTypeResolver)
CompositeContentTypeResolver
to help determine the
media types for resources being served. If the manager contains a path
extension resolver it will be checked for registered file extension.contentTypeResolver
- the resolver in usepublic CompositeContentTypeResolver getContentTypeResolver()
CompositeContentTypeResolver
.public void afterPropertiesSet() throws Exception
afterPropertiesSet
in interface org.springframework.beans.factory.InitializingBean
Exception
protected void initAllowedLocations()
PathResourceResolver
among the configured resource
resolvers and set its allowedLocations
property (if empty) to
match the locations
configured on this class.public void afterSingletonsInstantiated()
afterSingletonsInstantiated
in interface org.springframework.beans.factory.SmartInitializingSingleton
protected PathExtensionContentTypeResolver initContentNegotiationStrategy()
public reactor.core.publisher.Mono<Void> handle(org.springframework.web.server.ServerWebExchange exchange)
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.
handle
in interface org.springframework.web.server.WebHandler
protected reactor.core.publisher.Mono<org.springframework.core.io.Resource> getResource(org.springframework.web.server.ServerWebExchange exchange)
protected String processPath(String path)
The default implementation replaces any combination of leading '/' and
control characters (00-1F and 7F) with a single "/" or "". For example
" // /// //// foo/bar"
becomes "/foo/bar"
.
protected boolean isInvalidPath(String path)
StringUtils.cleanPath(java.lang.String)
.
valid URL
or would represent one after the leading slash is removed.
Note: this method assumes that leading, duplicate '/' or control characters (e.g. white space) have been trimmed so that the path starts predictably with a single '/' or does not have one.
path
- the path to validatetrue
if the path is invalid, false
otherwiseprotected org.springframework.http.MediaType getMediaType(org.springframework.web.server.ServerWebExchange exchange, org.springframework.core.io.Resource resource)
PathExtensionContentTypeResolver.resolveMediaTypeForResource(Resource)
.exchange
- the current exchangeresource
- the resource to checknull
if none foundprotected void setHeaders(org.springframework.web.server.ServerWebExchange exchange, org.springframework.core.io.Resource resource, org.springframework.http.MediaType mediaType) throws IOException
exchange
- current exchangeresource
- the identified resource (never null
)mediaType
- the resource's media type (never null
)IOException