summaryrefslogtreecommitdiffstats
path: root/documentation/articles/SettingAndReadingCookies.asciidoc
blob: 09ad066ca7f74243663a3d9cb68fa516f263e7f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
---
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");
....