복붙노트

[SPRING] 봄 : REST 호출 응답에 쿠키 삽입

SPRING

봄 : REST 호출 응답에 쿠키 삽입

봄 API를 사용하여 REST API 끝점을 구현하고 있습니다. 쿠키 값을 사용하여 HTTP 응답을 다시 보내려고합니다. 이것은 루비에서해야 할 일과 동등합니다. 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. ==============================

    1.원시 Set-Cookie 헤더를 사용하여 쿠키를 설정할 수는 있지만 Servlet API를 사용하는 것이 더 쉽습니다.

    원시 Set-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);    
    
    }
    

    필요한 경우 쿠키 객체에 매개 변수를 더 추가 할 수도 있습니다.

    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);
    
  2. ==============================

    2.마침내 해결책을 찾았습니다.

    마침내 해결책을 찾았습니다.

    HttpHeaders headers = new HttpHeaders();
    headers.add("Set-Cookie","key="+"value");
    ResponseEntity.status(HttpStatus.OK).headers(headers).build();
    
  3. ==============================

    3.쿠키 용 Spring API를 사용할 수 있습니다 : org.springframework.http.HttpCookie :

    쿠키 용 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);
    
  4. ==============================

    4.Hey 응답 객체에 쿠키를 추가하고 @CookieParam을 사용하여 응답 객체에서 쿠키를 읽는 방법에 대한 예제가 있습니다.

    Hey 응답 객체에 쿠키를 추가하고 @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();
    
    }
    }
    
  5. from https://stackoverflow.com/questions/24642508/spring-inserting-cookies-in-a-rest-call-response by cc-by-sa and MIT license