Skip to content

Commit 19b0dca

Browse files
committed
moved
1 parent f901f89 commit 19b0dca

File tree

3 files changed

+254
-0
lines changed

3 files changed

+254
-0
lines changed

assets/EvercookieCacheServlet.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package evercookie;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.ServletException;
6+
import javax.servlet.ServletOutputStream;
7+
import javax.servlet.annotation.WebServlet;
8+
import javax.servlet.http.Cookie;
9+
import javax.servlet.http.HttpServlet;
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletResponse;
12+
13+
/**
14+
* This is a Java Servlet port of evercookie_cache.php, the server-side
15+
* component of Evercookie's cacheData mechanism.
16+
*
17+
* Install this servlet at /evercookie_cache.php in your web.xml (or add a @WebServlet
18+
* annotation) and you won't even need to modify evercookie.js! This assumes
19+
* that Evercookie's assets are in your web root.
20+
*
21+
* Of course, if you have set $_ec_baseurl to something, you should install this
22+
* at [$_ec_baseurl]evercookie_cache.php. Remember, $ec_baseurl needs a trailing
23+
* slash in the evercookie.js.
24+
*
25+
* @author Gabriel Bauman <[email protected]>
26+
*
27+
*/
28+
public class EvercookieCacheServlet extends HttpServlet {
29+
30+
private static final long serialVersionUID = 1L;
31+
32+
public EvercookieCacheServlet() {
33+
super();
34+
}
35+
36+
@Override
37+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
38+
39+
boolean cookieExists = false;
40+
String cookieValue = null;
41+
Cookie[] cookies = req.getCookies();
42+
43+
if (null != cookies) {
44+
// Iterate over cookies until we find one named evercookie_cache
45+
for (Cookie cookie : cookies)
46+
{
47+
if (cookie.getName().equals("evercookie_cache")) {
48+
cookieExists = true;
49+
cookieValue = cookie.getValue();
50+
break;
51+
}
52+
}
53+
}
54+
55+
// If the cookie doesn't exist, send 304 Not Modified and exit.
56+
if (!cookieExists) {
57+
resp.setStatus(304);
58+
return;
59+
}
60+
61+
// The cookie was present; set up the response headers.
62+
resp.setContentType("text/html");
63+
resp.addHeader("Last-Modified", "Wed, 30 Jun 2010 21:36:48 GMT");
64+
resp.addHeader("Expires", "Tue, 31 Dec 2030 23:30:45 GMT");
65+
resp.addHeader("Cache-Control", "private, max-age=630720000");
66+
67+
// Print the contents of the cookie as the response body.
68+
ServletOutputStream body = resp.getOutputStream();
69+
70+
try {
71+
body.print(cookieValue);
72+
} finally {
73+
body.close();
74+
}
75+
76+
// And we're done.
77+
resp.setStatus(200);
78+
resp.flushBuffer();
79+
}
80+
}

assets/EvercookieEtagServlet.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package evercookie;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.ServletException;
6+
import javax.servlet.ServletOutputStream;
7+
import javax.servlet.annotation.WebServlet;
8+
import javax.servlet.http.Cookie;
9+
import javax.servlet.http.HttpServlet;
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletResponse;
12+
13+
/**
14+
* This is a Java Servlet port of evercookie_etag.php, the server-side component
15+
* of Evercookie that uses the If-None-Match and Etag headers to keep track of
16+
* persistent values.
17+
*
18+
* Install this servlet at /evercookie_etag.php in your web.xml (or add a @WebServlet
19+
* annotation) and you won't even need to modify evercookie.js! This assumes
20+
* that Evercookie's assets are in your web root.
21+
*
22+
* Of course, if you have set $_ec_baseurl to something, you should install this
23+
* at [$_ec_baseurl]evercookie_etag.php. Remember, $ec_baseurl needs a trailing
24+
* slash in the evercookie.js.
25+
*
26+
* @author Gabriel Bauman <[email protected]>
27+
*
28+
*/
29+
public class EvercookieEtagServlet extends HttpServlet {
30+
31+
private static final long serialVersionUID = 1L;
32+
33+
public EvercookieEtagServlet() {
34+
super();
35+
}
36+
37+
@Override
38+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
39+
40+
boolean cookieExists = false;
41+
String cookieValue = null;
42+
Cookie[] cookies = req.getCookies();
43+
44+
if (null != cookies) {
45+
// Iterate over cookies until we find one named evercookie_etag
46+
for (Cookie cookie : cookies)
47+
{
48+
if (cookie.getName().equals("evercookie_etag")) {
49+
cookieExists = true;
50+
cookieValue = cookie.getValue();
51+
break;
52+
}
53+
}
54+
}
55+
56+
ServletOutputStream body = resp.getOutputStream();
57+
58+
try {
59+
60+
if (cookieExists) {
61+
// Cookie set; send cookie value as Etag header/response body.
62+
resp.addHeader("Etag", cookieValue);
63+
body.print(cookieValue);
64+
}
65+
else
66+
{
67+
// No cookie; set the body to the request's If-None-Match value.
68+
body.print(req.getHeader("If-None-Match"));
69+
}
70+
71+
} finally {
72+
// close the output stream.
73+
body.close();
74+
}
75+
76+
resp.setStatus(200);
77+
78+
}
79+
}

assets/EvercookiePngServlet.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package evercookie;
2+
3+
import java.awt.Color;
4+
import java.awt.RenderingHints;
5+
import java.awt.image.BufferedImage;
6+
import java.io.IOException;
7+
import java.io.OutputStream;
8+
9+
import javax.imageio.ImageIO;
10+
import javax.servlet.ServletException;
11+
import javax.servlet.annotation.WebServlet;
12+
import javax.servlet.http.Cookie;
13+
import javax.servlet.http.HttpServlet;
14+
import javax.servlet.http.HttpServletRequest;
15+
import javax.servlet.http.HttpServletResponse;
16+
17+
/**
18+
* This is a Java Servlet port of evercookie_png.php, the server-side component
19+
* of Evercookie that stores values in force-cached PNG image data.
20+
*
21+
* Install this servlet at /evercookie_png.php in your web.xml (or add a @WebServlet
22+
* annotation) and you won't even need to modify evercookie.js! This assumes
23+
* that Evercookie's assets are in your web root.
24+
*
25+
* Of course, if you have set $_ec_baseurl to something, you should install this
26+
* at [$_ec_baseurl]evercookie_png.php. Remember, $ec_baseurl needs a trailing
27+
* slash in the evercookie.js.
28+
*
29+
* @author Gabriel Bauman <[email protected]>
30+
*
31+
*/
32+
public class EvercookiePngServlet extends HttpServlet {
33+
34+
private static final long serialVersionUID = 1L;
35+
36+
public EvercookiePngServlet() {
37+
super();
38+
}
39+
40+
@Override
41+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
42+
43+
boolean cookieExists = false;
44+
String cookieValue = null;
45+
Cookie[] cookies = req.getCookies();
46+
47+
if (null != cookies) {
48+
// Iterate over cookies until we find one named evercookie_png
49+
for (Cookie cookie : cookies)
50+
{
51+
if (cookie.getName().equals("evercookie_png")) {
52+
cookieExists = true;
53+
cookieValue = cookie.getValue();
54+
break;
55+
}
56+
}
57+
}
58+
59+
// If the cookie doesn't exist, send 304 Not Modified and exit.
60+
if (!cookieExists) {
61+
resp.setStatus(304);
62+
return;
63+
}
64+
65+
// Generate a PNG image from the cookie value.
66+
BufferedImage image = new BufferedImage(200, 1, BufferedImage.TYPE_INT_ARGB);
67+
image.createGraphics().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
68+
int x = 0;
69+
70+
for (int i = 0; i < cookieValue.length(); i += 3) {
71+
// Treat every 3 chars of the cookie value as an {R,G,B} triplet.
72+
Color c = new Color(cookieValue.charAt(i), cookieValue.charAt(i + 1), cookieValue.charAt(i + 2));
73+
image.setRGB(x++, 0, c.getRGB());
74+
}
75+
76+
// The cookie was present; set up the response headers.
77+
resp.setContentType("image/png");
78+
resp.addHeader("Last-Modified", "Wed, 30 Jun 2010 21:36:48 GMT");
79+
resp.addHeader("Expires", "Tue, 31 Dec 2033 23:30:45 GMT");
80+
resp.addHeader("Cache-Control", "private, max-age=630720000");
81+
82+
// Send the generate image data as the response body.
83+
OutputStream body = resp.getOutputStream();
84+
85+
try {
86+
ImageIO.write(image, "png", body);
87+
} finally {
88+
body.close();
89+
}
90+
91+
// And we're done.
92+
resp.setStatus(200);
93+
resp.flushBuffer();
94+
}
95+
}

0 commit comments

Comments
 (0)