Search code examples
javajquerycookiesrestlet

Restlet: cookie is not sent to all pages of the domain/app


I have a restlet resource that authenticates a person and sets a cookie with a key:

@Post("json")
public Representation login(String json) {
    // validate user credentials ...

    getResponse().getCookieSettings().add(new CookieSetting(1, "k", key));
    getResponse().getCookieSettings().add(new CookieSetting(1, "p", person.getURI()));

    return new StringRepresentation(response.toString(), MediaType.APPLICATION_JSON);
}

When I invoke the URL associated with the login() method, everything seems to be fine. The cookies seem to be returned correctly in the response, and if I already have received cookies before, they are sent to the server:

Remote Address: 127.0.0.1:8000
Request URL: http://127.0.0.1:8000/api/person
Request Method: POST
Status Code: 200 OK

Request Headers

Accept: undefined
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,pt-PT;q=0.6,pt;q=0.4,es-419;q=0.2,es;q=0.2,en-GB;q=0.2
Connection: keep-alive
Content-Length: 42
Content-Type: application/json
Cookie: k="546f71445bf1bacd60a3f715d0250267"; p="http://compflow.pt/flowOntology/admin"
Host: 127.0.0.1:8000
Origin: http://127.0.0.1:8000
Referer: http://127.0.0.1:8000/job
X-Requested-With: XMLHttpRequest

Response Headers

Accept-Ranges: bytes
Content-Length: 46
Content-Type: application/json; charset=UTF-8
Date: Tue, 01 Jul 2014 15:05:13 GMT
Server: Restlet-Framework/2.1.7
Set-Cookie: k=546f71445bf1bacd60a3f715d0250267
Set-Cookie: p=http://compflow.pt/flowOntology/admin
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept

The invocation to http://127.0.0.1:8000/api/person is performed through an AJAX call using JQuery as follows:

$.ajax({
        url: '/api/person',
        type:'POST',
        accepts : "application/json",
        contentType : "application/json",
        processData : false,
        dataType : "text",
        data: JSON.stringify(data),
        success: function (data) {
            data = JSON.parse(data);    
            sessionStorage["userData"] = JSON.stringify(data.data);
            if(callback) callback();
        },
        error: function(data) {
             $('.alert-error').text(data).show();
        }
    });

However, if I try to perform a GET (directly through the browser) to the address http://127.0.0.1:8000/job, the cookies are not sent. The Cookie header is not set in the request.

Since it is not a cross-domain request and no restrictions are set regarding the path and domain of the cookies (I have tried setting them to "/" and "127.0.0.1" to no avail), I have no ideas left regarding what may be causing this issue. I would greatly appreciate all the help you can give me.


Solution

  • Curiously, the kind of HTTP server connector changes the behavior of the code. I've entered an issue for that (https://github.com/restlet/restlet-framework-java/issues/927).

    As a workaround, I suggest you to precise the path, as follow:

    getCookieSettings().add(new CookieSetting(0, "k", key, "/", null));
    

    NB: inside a ServerResource; you can use the shortcut "getCookieSettings()", instead of "getResponse().getCookieSettings()".