web-dev-qa-db-fra.com

Comment paramétrer et vérifier les cookies avec JAX-RS?

Je suis un noobie avec l'API RESTful et j'essaie de créer un service de connexion dans lequel je fournis un e-mail et un mot de passe et si la validation réussit - pour stocker un cookie. De plus, comment puis-je vérifier le cookie (s'il est stocké)?

Comment cela peut il etre accompli?

@Path("/login")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON})
public Response Login(final String i_LoginDetails) throws JSONException {
    final JSONObject obj = new JSONObject(i_LoginDetails);
    try {
        if (isValidUser(obj.getString("email"), obj.getString("password"))) {
            // Set a cookie
        } else {
            // return error invalid-credentials message
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return Response.ok("TEST").build();
}

Et comment puis-je vérifier le cookie (s'il est défini)?

22
Gil404

Vous pouvez effectuer les opérations suivantes:

  • Pour stocker un nouveau cookie:

    @GET
    @Path("/login")
    @Produces(MediaType.TEXT_PLAIN)
    public Response login() {
        NewCookie cookie = new NewCookie("name", "123");
        return Response.ok("OK").cookie(cookie).build();
    }
    
  • Pour récupérer le cookie (javax.ws.rs.core.Cookie):

    @GET
    @Path("/foo")
    @Produces(MediaType.TEXT_PLAIN)
    public Response foo(@CookieParam("name") Cookie cookie) {
        if (cookie == null) {
            return Response.serverError().entity("ERROR").build();
        } else {
            return Response.ok(cookie.getValue()).build();
        }
    }
    

    Cependant, vous ne souhaiterez peut-être que la valeur:

    @GET
    @Path("/foo")
    @Produces(MediaType.TEXT_PLAIN)
    public Response foo(@CookieParam("name") String value) {
        System.out.println(value);
        if (value == null) {
            return Response.serverError().entity("ERROR").build();
        } else {
            return Response.ok(value).build();
        }
    }
    

Au fait, vous voudrez peut-être essayer le code suivant:

@GET
@Path("/logout")
@Produces(MediaType.TEXT_PLAIN)
public Response logout(@CookieParam("name") Cookie cookie) {
    if (cookie != null) {
        NewCookie newCookie = new NewCookie(cookie, null, 0, false);
        return Response.ok("OK").cookie(newCookie).build();
    }
    return Response.ok("OK - No session").build();
}

Cela supprime le cookie dans le navigateur. Le comportement dépend de l'implémentation de JAX-RS. Avec RESTEasy (JBoss AS 7.0) et Google Chrome fonctionne bien.

39
Paul Vargas