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.
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);
J'ai finalement trouvé la solution:
HttpHeaders headers = new HttpHeaders();
headers.add("Set-Cookie","key="+"value");
ResponseEntity.status(HttpStatus.OK).headers(headers).build();
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);
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();
}
}