Spring:在 REST 调用响应中插入 cookie
Posted
技术标签:
【中文标题】Spring:在 REST 调用响应中插入 cookie【英文标题】:Spring :Inserting cookies in a REST call response 【发布时间】:2014-08-29 19:39:59 【问题描述】:我正在使用 spring mvc 实现 REST 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);
我该怎么办?谢谢。
【问题讨论】:
【参考方案1】:你也可以使用
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.COOKIE, cookie-name + "=" + cookie value);
ResponseEntity.status(HttpStatus.OK).headers(headers).build();
【讨论】:
【参考方案2】:嘿,这里是如何将 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();
【讨论】:
【参考方案3】:您可以使用 Spring API 获取 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);
【讨论】:
【参考方案4】:我终于找到了解决办法:
HttpHeaders headers = new HttpHeaders();
headers.add("Set-Cookie","key="+"value");
ResponseEntity.status(HttpStatus.OK).headers(headers).build();
【讨论】:
遗憾的是,这不包括确保您的 cookie 仅在特定域和/或安全上下文中使用的附加值。因此,由客户来选择这些值。 您可以在该字符串中配置任何 cookie 选项:示例:headers.add("Set-Cookie","key="+"value"+";Max-Age=3600;Secure; HttpOnly ");【参考方案5】:虽然可以使用原始 Set-Cookie
标头设置 cookie,但使用 Servlet 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);
【讨论】:
我可以向您寻求有关 cookie 和基本身份验证的类似问题的帮助吗? ***.com/questions/54554510/…以上是关于Spring:在 REST 调用响应中插入 cookie的主要内容,如果未能解决你的问题,请参考以下文章
@ManyToOne关系在Spring Data REST中插入空对象
如何在 Spring Boot 中使用带有 Bearer Token 和 form-data 的 Rest Template 调用 REST Api
Spring boot rest api - 我可以在不为响应对象创建任何 java 类(DTO 或实体)的情况下获得响应吗?
Grails - Spring Security REST - 302 响应网络::ERR_TOO_MANY_REDIRECTS