私はREST spring mvcを使用してAPIエンドポイントを実装しています。Cookie値を含むHTTP応答を返送しようとしています。これは、私がする必要があるものと同等ですRuby SINATRA:
response.set_cookie('heroku-nav-data', :value => params['nav-data'], :path => '/')
これは私がこれまでに試したことですが、うまくいきませんでした:
@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);
}
私は何をすべきか ?ありがとう。
生のSet-Cookie
ヘッダーを使用してCookieを設定することは可能ですが、サーブレットAPIを使用する方が簡単です。
HttpServletResponse
パラメーターをコントローラーメソッドに追加すると、Springは関連するインスタンスを渡します。次に、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);
}
必要に応じて、Cookieオブジェクトにさらにパラメータを追加することもできます。
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);
私は最終的に解決策を見つけました:
HttpHeaders headers = new HttpHeaders();
headers.add("Set-Cookie","key="+"value");
ResponseEntity.status(HttpStatus.OK).headers(headers).build();
CookieにSpring APIを使用できます: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);
こんにちは、Cookieを応答オブジェクトに追加し、@ CookieParamを使用して応答オブジェクトからCookieを読み取る方法の例です。
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();
}
}