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 11808 and 12518). 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 Servlethttp://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");