ServletWebRequest.checkNotModified() methods don't treat a HEAD request identically to a GET request (in fact they don't consider HEAD at all).
The HEAD method is identical to GET except that the server MUST NOT
return a message-body in the response. The metainformation contained
in the HTTP headers in response to a HEAD request SHOULD be identical
to the information sent in response to a GET request.
Spring's reference documentation suggests to call WebRequest.checkNotModified() to set the status code to 304:
calling request.checkNotModified(lastModified) and returning null. The
former sets the response status to 304
As a consequence of the current implementation, applications which follow that recommendation violate against HTTP. In simple words: I had some fun debugging my application for a missing 304 status code while firing HEAD requests with wget --server-response --spider on it.
I suggest to respect HEAD in the mentioned methods identically to GET.
For test case and fix see https://github.com/spring-projects/spring-framework/pull/440