Validators and validation
Caching in HTTP gains improved efficiency through validation mechanisms, including entity tags (Etags) and last-modified dates. This section describes the high-level support for validation available in IBM® WebSphere® sMash.
Within WebSphere sMash, static-file serving supports ETags and caching.
Validators
Etags
Entity tags (etags) are opaque strings associated with a representation (HTTP response body); an etag changes only when the representation changes. An etag is commonly a hash of the information that affects your resource's representation. For example, for a representation derived from a database query and a rendering template, the associated etag might be a hash of the last-update time from the database and the template's last-modified time. WebSphere sMash provides utility APIs for hashing and setting theEtag response header. In Java:
import zero.core.etags.Etag; ... String concatenatedInformation = ... /* contains the distinguishing information */ String etag = Etag.computeHashedValue(concatenatedInformation); ... Etag.setEtagHeader(etag);
Last-modified date
WebSphere sMash automatically adds aLast-Modified response header when serving static files. The value is the last modified time of the served file, formatted according to RFC1123 (e.g. Wed, 22 May 1996 12:06:00 GMT).
For other cases where you want to manually set the Last-Modified header, you can do so with the Global Context and the HttpDateFormat utility formatter. For example, in Java:
zput(Request.Headers.out + "/Last-Modified",
new zero.util.HttpDateFormat().format(new java.util.Date()));
headers.out.['Last-Modified'] = new zero.util.HttpDateFormat().format(new Date()))
Validation
"Validation" is the process of checking whether validators (presented by the client) match the current state. Validation can be used as the basis of conditional GET and PUT requests. For example, the response to a "conditional GET", if the representation hasn't changed, could be a bandwidth-saving 304 Not Modified. Also, a "conditional PUT" could be denied if the submitted etag no longer matches -- which prevents the "lost update" problem. WebSphere sMash provides thePreconditionValidator utility, which enables you to integrate validation into your handlers:
boolean valid = PreconditionValidator.validate(String etag); boolean valid = PreconditionValidator.validate(String etag, Date lastModified);
| Header Type | Condition Met | Condition Not Met |
| if-match | return true | status code set to 412, return false |
| if-none-match (GET/HEAD) | return true | status code set to 304, return false |
| if-none-match (other HTTP methods) | return true | status code set to 412, return false |
| if-modified-since | return true | status code set to 304, return false |
| if-unmodified-since | return true | status code set to 304, return false |