---
title: Setting And Reading Cookies
order: 16
layout: page
---

[[setting-and-reading-cookies]]
= Setting And Reading Cookies

You can easily read and write
http://en.wikipedia.org/wiki/HTTP_cookie[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
http://dev.vaadin.com/ticket/11808[11808] and
http://dev.vaadin.com/ticket/12518[12518]). Beginning in Vaadin 7.6,
cookies can be used with the WEBSOCKET_XHR transport type.

The
https://vaadin.com/api/7.0.3/com/vaadin/server/VaadinRequest.html[VaadinRequest]
class gives easy access to the collection of cookies bundled with each
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol[HTTP] request.
Each cookie is represented as instances of the
http://docs.oracle.com/javaee/6/api/javax/servlet/http/Cookie.html[javax.servlet.http.Cookie]
class defined by the Java
http://en.wikipedia.org/wiki/Java_Servlet[Servlet]http://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:

[source,java]
....
// 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:

[source,java]
....
// 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.

[source,java]
....
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: 

[source,java]
....
// Read name from cookie
String name = Cookies.getCookie("name");

// Write new value to cookie
Cookies.setCookie("name", "Some other value");
....
