Browse Source

Add HTTP caching to WebFlux section

Issue: SPR-16395
pull/1856/head
Rossen Stoyanchev 8 years ago
parent
commit
ef41dcf687
  1. 118
      src/docs/asciidoc/web/webflux.adoc
  2. 4
      src/docs/asciidoc/web/webmvc.adoc

118
src/docs/asciidoc/web/webflux.adoc

@ -2540,6 +2540,124 @@ include::webflux-view.adoc[leveloffset=+1]
[[webflux-caching]]
== HTTP Caching
[.small]#<<web.adoc#mvc-caching,Same in Spring MVC>>#
HTTP caching can significantly improve the performance of a web application. HTTP caching
revolves around the "Cache-Control" response header and subsequently conditional request
headers such as "Last-Modified" and "ETag". "Cache-Control" advises private (e.g. browser)
and public (e.g. proxy) caches how to cache and re-use responses. An "ETag" header is used
to make a conditional request that may result in a 304 (NOT_MODIFIED) without a body,
if the content has not changed. "ETag" can be seen as a more sophisticated successor to
the `Last-Modified` header.
This section describes HTTP caching related options available in Spring Web MVC.
[[webflux-caching-cachecontrol]]
=== `CacheControl`
[.small]#<<web.adoc#mvc-caching-cachecontrol,Same in Spring MVC>>#
{api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for
configuring settings related to the "Cache-Control" header and is accepted as an argument
in a number of places:
* <<webflux-caching-etag-lastmodified>>
* <<webflux-caching-static-resources>>
While https://tools.ietf.org/html/rfc7234#section-5.2.2[RFC 7234] describes all possible
directives for the "Cache-Control" response header, the `CacheControl` type takes a
use case oriented approach focusing on the common scenarios:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
// Cache for an hour - "Cache-Control: max-age=3600"
CacheControl ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS);
// Prevent caching - "Cache-Control: no-store"
CacheControl ccNoStore = CacheControl.noStore();
// Cache for ten days in public and private caches,
// public caches should not transform the response
// "Cache-Control: max-age=864000, public, no-transform"
CacheControl ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic();
----
[[webflux-caching-etag-lastmodified]]
=== Controllers
[.small]#<<web.adoc#mvc-caching-etag-lastmodified,Same in Spring MVC>>#
Controllers can add explicit support for HTTP caching. This is recommended since the
lastModified or ETag value for a resource needs to be calculated before it can be compared
against conditional request headers. A controller can add an ETag and "Cache-Control"
settings to a `ResponseEntity`:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@GetMapping("/book/{id}")
public ResponseEntity<Book> showBook(@PathVariable Long id) {
Book book = findBook(id);
String version = book.getVersion();
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified is also available
.body(book);
}
----
This will send an 304 (NOT_MODIFIED) response with an empty body, if the comparison
to the conditional request headers indicates the content has not changed. Otherwise the
"ETag" and "Cache-Control" headers will be added to the response.
The check against conditional request headers can also be made in the controller:
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@RequestMapping
public String myHandleMethod(ServerWebExchange exchange, Model model) {
long eTag = ... <1>
if (exchange.checkNotModified(eTag)) {
return null; <2>
}
model.addAttribute(...); <3>
return "myViewName";
}
----
<1> Application-specific calculation.
<2> Response has been set to 304 (NOT_MODIFIED), no further processing.
<3> Continue with request processing.
There are 3 variants for checking conditional requests against eTag values, lastModified
values, or both. For conditional "GET" and "HEAD" requests, the response may be set to
304 (NOT_MODIFIED). For conditional "POST", "PUT", and "DELETE", the response would be set
to 409 (PRECONDITION_FAILED) instead to prevent concurrent modification.
[[webflux-caching-static-resources]]
=== Static resources
[.small]#<<web.adoc#mvc-caching-static-resources,Same in Spring MVC>>#
Static resources should be served with a "Cache-Control" and conditional response headers
for optimal performance. See section on configuring <<webflux-config-static-resources>>.
[[webflux-config]] [[webflux-config]]
== WebFlux Config == WebFlux Config
[.small]#<<web.adoc#mvc-config,Same in Spring MVC>># [.small]#<<web.adoc#mvc-config,Same in Spring MVC>>#

4
src/docs/asciidoc/web/webmvc.adoc

@ -3708,6 +3708,7 @@ http://hdiv.org/[HDIV] is another web security framework that integrates with Sp
[[mvc-caching]] [[mvc-caching]]
== HTTP Caching == HTTP Caching
[.small]#<<web-reactive.adoc#webflux-caching,Same in Spring WebFlux>>#
HTTP caching can significantly improve the performance of a web application. HTTP caching HTTP caching can significantly improve the performance of a web application. HTTP caching
revolves around the "Cache-Control" response header and subsequently conditional request revolves around the "Cache-Control" response header and subsequently conditional request
@ -3723,6 +3724,7 @@ This section describes HTTP caching related options available in Spring Web MVC.
[[mvc-caching-cachecontrol]] [[mvc-caching-cachecontrol]]
=== `CacheControl` === `CacheControl`
[.small]#<<web-reactive.adoc#webflux-caching-cachecontrol,Same in Spring WebFlux>>#
{api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for {api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for
configuring settings related to the "Cache-Control" header and is accepted as an argument configuring settings related to the "Cache-Control" header and is accepted as an argument
@ -3764,6 +3766,7 @@ works as follows:
[[mvc-caching-etag-lastmodified]] [[mvc-caching-etag-lastmodified]]
=== Controllers === Controllers
[.small]#<<web-reactive.adoc#webflux-caching-etag-lastmodified,Same in Spring WebFlux>>#
Controllers can add explicit support for HTTP caching. This is recommended since the Controllers can add explicit support for HTTP caching. This is recommended since the
lastModified or ETag value for a resource needs to be calculated before it can be compared lastModified or ETag value for a resource needs to be calculated before it can be compared
@ -3823,6 +3826,7 @@ to 409 (PRECONDITION_FAILED) instead to prevent concurrent modification.
[[mvc-caching-static-resources]] [[mvc-caching-static-resources]]
=== Static resources === Static resources
[.small]#<<web-reactive.adoc#webflux-caching-static-resources,Same in Spring WebFlux>>#
Static resources should be served with a "Cache-Control" and conditional response headers Static resources should be served with a "Cache-Control" and conditional response headers
for optimal performance. See section on configuring <<mvc-config-static-resources>>. for optimal performance. See section on configuring <<mvc-config-static-resources>>.

Loading…
Cancel
Save