- Come to the dark side, we have cookies
Some components for Spring MVC that use cookies instead of a HTTP session.
-
A cookie based FlashMapManager implementation that can be used with different serialization and signing implementations.
By default a Jackson based JSON implementation for serialization and HMAC implementation for signing is provided.
Download library through Maven:
<dependency>
<groupId>com.innoq</groupId>
<artifactId>spring-cookie</artifactId>
<version>1.2.0</version>
</dependency>
To enable cookie-based Flash attributes, register the CookieFlashMapManager
as a Spring @Bean
. You can customize the codec and signing mechanism:
@Configuration
public class FlashAttributeStrategy {
@Bean
public CookieFlashMapManager cookieFlashMapManager() {
return new CookieFlashMapManager(
JacksonFlashMapListCodec.create(), // JSON serialization
CookieValueSigner.hmacSha512(secretKeyBytes), // Strong cookie signing
"flash" // Name of the cookie
);
}
}
Make sure to replace secretKeyBytes
with a proper 64-byte key for HMAC-SHA-256 signing.
This is a typical POST-to-GET redirect pattern: after a POST request performs an action, the user is redirected to a GET endpoint that displays a result message.
@PostMapping("/send-message")
public String updateChangeRequestStatus(final RedirectAttributes redirectAttributes) {
final String message = sendMessage()
? "Okay, your message was submitted."
: "Sending your message failed.";
redirectAttributes.addFlashAttribute("message", message);
return "redirect:/messages";
}
@GetMapping("/messages")
@ResponseBody
public String showMessage(@ModelAttribute("message") String message) {
return message;
}
The message is transferred via an HTTP cookie rather than session storage – making it suitable for stateless environments or APIs.
Spring Cookie stores serialized data directly in HTTP cookies. While this enables stateless architectures, it also introduces potential attack surfaces. To ensure safe use in production environments, follow these best practices:
The HMAC key should be at least 256 bits (32 bytes), preferably 512 bits (64 bytes) in length:
KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA256");
keyGen.init(512);
byte[] key = keyGen.generateKey().getEncoded();
Store and manage this key securely, ideally via environment variables or a vault.
Even signed cookies are visible to the client. Do not store personal data, tokens, or confidential information in flash attributes.
OK: status messages like "Saved successfully."
.
Avoid: user IDs, emails, access rights, etc.
See CHANGELOG.md
Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
Spring Cookie is Open Source software released under the Apache 2.0 license.