Setting And Reading Cookies
You can easily read and write cookies from both the server and the client side in Vaadin, with one caveat: Cookies are not possible if you enable Push using WebSocket (see tickets 3911 and 4411). Beginning in Vaadin 7.6, cookies can be used with the WEBSOCKET_XHR transport type.
The VaadinRequest class gives easy access to the collection of cookies bundled with each HTTP request. Each cookie is represented as instances of the javax.servlet.http.Cookie class defined by the Java Servlethttps://www.jcp.org/en/jsr/detail?id=315[spec].
To read a cookie on the server side you can request the cookies from the current request like so:
// Fetch all cookies
Cookie[] cookies = VaadinService.getCurrentRequest().getCookies();
That will fetch all currently defined cookies. You can then iterate over them to find the cookie you are looking for.
To add a new cookie or update an already defined cookie you can do the following:
// Create a new cookie
Cookie myCookie = new Cookie("cookie-name", "cookie-value");
// Make cookie expire in 2 minutes
myCookie.setMaxAge(120);
// Set the cookie path.
myCookie.setPath(VaadinService.getCurrentRequest().getContextPath());
// Save cookie
VaadinService.getCurrentResponse().addCookie(myCookie);
Here is a full example of utilizing cookies on the server side by
storing a a value from a TextField
in a cookie for later use.
public class CookieMonsterUI extends UI {
private static final String NAME_COOKIE = "name";
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout(); layout.setMargin(true);
setContent(layout);
final TextField nameField = new TextField(); layout.addComponent(nameField);
// Read previously stored cookie value
Cookie nameCookie = getCookieByName(NAME_COOKIE);
if (getCookieByName(NAME_COOKIE) != null) {
nameField.setValue(nameCookie.getValue());
}
Button button = new Button("Store name in cookie"); button.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
String name = nameField.getValue();
// See if name cookie is already set
Cookie nameCookie = getCookieByName(NAME_COOKIE);
if (nameCookie != null) {
String oldName = nameCookie.getValue();
nameCookie.setValue(name);
Notification.show("Updated name in cookie from " + oldName + " to " + name);
} else {
// Create a new cookie
nameCookie = new Cookie(NAME_COOKIE, name);
nameCookie .setComment("Cookie for storing the name of the user");
Notification.show("Stored name " + name + " in cookie");
}
// Make cookie expire in 2 minutes
nameCookie.setMaxAge(120);
// Set the cookie path.
nameCookie.setPath(VaadinService.getCurrentRequest() .getContextPath());
// Save cookie
VaadinService.getCurrentResponse().addCookie(nameCookie);
}
});
layout.addComponent(button);
}
private Cookie getCookieByName(String name) {
// Fetch all cookies from the request
Cookie[] cookies = VaadinService.getCurrentRequest().getCookies();
// Iterate to find cookie by its name
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}
Finally if you need to read a cookie from client-side code, you can use
the Cookies
class like so:
// Read name from cookie
String name = Cookies.getCookie("name");
// Write new value to cookie
Cookies.setCookie("name", "Some other value");