web-dev-qa-db-fra.com

Spring: insertion de cookies dans une réponse d'appel REST

J'implémente REST points de terminaison API en utilisant spring mvc. J'essaie de renvoyer une réponse HTTP avec une valeur de cookie. C'est l'équivalent de ce que je dois faire dans Ruby SINATRA:

  response.set_cookie('heroku-nav-data', :value => params['nav-data'], :path => '/')

C'est ce que j'ai essayé jusqu'à présent, mais cela n'a pas fonctionné:

@RequestMapping(value = "/login", method = RequestMethod.POST)
    public ResponseEntity<String> single_sign_on(@RequestBody String body_sso) {

        String[] tokens = body_sso.split("&");
        String nav_data=tokens[3].substring(9);
        String id = tokens[2].substring(3);
        String time_param = tokens[0].substring(10);
        long timestamp= Long.valueOf(time_param).longValue(); 

        String pre_token = id+':'+HEROKU_SSO_SALT+':'+time_param;
        String token = DigestUtils.shaHex(pre_token);
         long lDateTime = new Date().getTime()/1000;
        if (!((token.equals(tokens[4].substring(6))) && ((lDateTime-timestamp)<300)))
        {   
            return new ResponseEntity<String>(HttpStatus.FORBIDDEN);
        }

        HttpHeaders headers = new HttpHeaders();
        headers.add("heroku-nav-data",nav_data);// this didn't work
        return new ResponseEntity<String>(id,headers,HttpStatus.OK);    

}

Que devrais-je faire ? Merci.

11
user3242743

Bien qu'il soit possible de définir un cookie à l'aide d'un en-tête Set-Cookie Brut, il sera plus facile d'utiliser l'API Servlet:

Ajoutez le paramètre HttpServletResponse à votre méthode de contrôleur, Spring transmettra l'instance appropriée; puis utilisez la méthode addCookie:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<String> singleSignOn(@RequestBody String bodySso, HttpServletResponse response) {

    response.addCookie(new Cookie("heroku-nav-data", navData));
    return new ResponseEntity<String>(id,headers,HttpStatus.OK);    

}

Vous pouvez également ajouter plus de paramètres à l'objet cookie si nécessaire:

final Cookie cookie = new Cookie(this.cookieName, principal.getSignedJWT());
cookie.setDomain(this.cookieDomain);
cookie.setSecure(this.sendSecureCookie);
cookie.setHttpOnly(true);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
28
Pierre Henry

J'ai finalement trouvé la solution:

HttpHeaders headers = new HttpHeaders();
headers.add("Set-Cookie","key="+"value");
ResponseEntity.status(HttpStatus.OK).headers(headers).build();
10
user3242743

Vous pouvez utiliser Spring API for Cookie: org.springframework.http.HttpCookie:

HttpCookie cookie = ResponseCookie.from("heroku-nav-data", nav_data)
        .path("/")
        .build();
return ResponseEntity.ok()
        .header(HttpHeaders.SET_COOKIE, cookie.toString())
        .body(id);
6
vbezhenar

Hé Voici l'exemple de la façon d'ajouter un cookie à l'objet de réponse et de lire le cookie de l'objet de réponse en utilisant @CookieParam

package com.ft.resources;
import javax.ws.rs.CookieParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
@Path("/cookie")
public class CookieResource {

@GET
@Path("/write")
public Response write() {
    //create cookie
    NewCookie c1=new NewCookie("uname","gaurav");
    NewCookie c2=new NewCookie("password","gaurav@123");
    //adding cookie to response object
    return Response.ok().cookie(c1,c2).build();
}

@GET
@Path("/read")
public Response read(@CookieParam("uname") String uname,@CookieParam("password") 
String password) {
    System.out.println(uname);
    System.out.println(password);

    String msg="Username:"+uname;
    msg=msg.concat("</br>");
    msg=msg.concat("Password:"+password);
    return Response.ok(msg).build();

}
}
0
Gaurav Bhagat