【问题标题】:Spring :Inserting cookies in a REST call responseSpring:在 REST 调用响应中插入 cookie
【发布时间】: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);    

}

我该怎么办?谢谢。

【问题讨论】:

    标签: java spring rest spring-mvc spring-security


    【解决方案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);
          

          【讨论】:

          猜你喜欢
          • 2014-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-30
          • 2015-12-15
          • 1970-01-01
          • 2016-05-01
          • 1970-01-01
          相关资源
          最近更新 更多