Spring :Inserting cookies in a REST call response

java, rest, spring, spring-mvc, spring-security

Solution

While it is possible to set a cookie using a raw `Set-Cookie` header, it will be easier to use the Servlet API :

Add the `HttpServletResponse` parameter to your controller method, Spring will pass the relevant instance; then use the `addCookie` method :

@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);    

}

You can also add more parameters to the cookie object if needed:

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);

Problem

I am implementing REST API endpoints using spring mvc. I am trying to send back a HTTP response with a cookie value. This is the equivalent of what I need to do in ruby SINATRA : ``` response.set_cookie('heroku-nav-data', :value => params['nav-data'], :path => '/') ``` This is what I have tried so far, but that didn't work : ``` @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); } ``` What should I do ? thanks.

Original source