【问题标题】:JAX-RS @CookieParam value changes from a request to anotherJAX-RS @CookieParam 值从一个请求更改为另一个
【发布时间】:2018-08-08 18:09:32
【问题描述】:

我正在尝试制作一种将产品添加到购物车中的资源。我正在尝试将产品添加到购物车并将购物车保存为 cookie 中的 JSON 字符串。 (这里的 Cart 对象有 2 个字段,productId 和 quantity)

@POST
@Path("/update")
@Produces(MediaType.APPLICATION_JSON)
public Response updateShoppingCart(@CookieParam(COOKIE_NAME) javax.ws.rs.core.Cookie cookie, Cart cart) {
    NewCookie newCookie = null;
    ObjectMapper mapper = new ObjectMapper();
    if (cookie !=null){
        try {
            List<Cart> shoppingCart = mapper.readValue(cookie.getValue(), new TypeReference<List<Cart>>() {
            });
            //the case where there is already something in the shopping cart
            //...
            String jsonString = mapper.writeValueAsString(shoppingCart);
            newCookie = new NewCookie(COOKIE_NAME, jsonString,"/", "", "shopping-cart", MAX_AGE, false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else{
        List<Cart> carts = new ArrayList<>();
        carts.add(cart);
        try {
            String jsonString = mapper.writeValueAsString(carts);
            newCookie = new NewCookie(COOKIE_NAME, jsonString,"/", "", "shopping-cart", MAX_AGE, false);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
    return Response.ok(newCookie).cookie(newCookie).build();
}

当我第一次运行它时,cookie 设置正确,例如它设置了正确的值:[{\"productId\":1,\"quantity\":2}] 如果我添加一个带有id 1 和数量 2。 问题是,当我第二次运行时,作为 CookieParam 接收的 cookie 的值不正确,在本例中为 [{\"productId\":1 。 我正在使用 Postman 对此进行测试,并在正文中发送带有 JSON {"productId":1, "quantity":2} 的 POST 请求。 我做错了什么?

【问题讨论】:

    标签: java json jakarta-ee cookies jax-rs


    【解决方案1】:

    Cookie 必须放在标题中,而不是正文中。比如:

    Cookie: name=value; name2=value2; name3=value3
    

    邮递员请参考:https://www.getpostman.com/docs/postman/sending_api_requests/cookies

    更新:根据我的经验,邮递员有时不发送 cookie。尝试将 postman 命令转换为 curl 命令(参考:https://www.getpostman.com/docs/postman/sending_api_requests/generate_code_snippets),然后确保 curl 命令在标头或 -b 参数中包含 cookie(参考:https://curl.haxx.se/docs/manpage.html

    【讨论】:

    • 但这正是我在 Response.ok(newCookie).cookie(newCookie).build(); .我在代码中使用 JSON 值设置 cookie,而不是 Postman。我从 body 对象构建的 JSON,它是 Cart 类型对象 {"productId":1, "quantity":2})
    • 您可以在 Postman 响应 cookie 中看到,如果您在代码中设置的 cookie 回来了。但在下一个请求中 - 您必须手动将 cookie 从响应复制到请求。
    • 我也可以在您提供的链接中描述的“管理cookies”框中看到它,我不必手动添加它。在 Postman 中,我在 cookie 中看到了正确的值。当我使用 @CookieParam 获取 cookie 时,问题出在资源中
    • 在“管理 Cookies”中,我的 cookie 中有类似的内容: shoppingCart=[{\"productId\":1,\"quantity\":2}];路径=/;域=本地主机;过期时间=格林威治标准时间 2018 年 3 月 1 日星期四 18:58:18;
    • Postman 很可能没有发送 cookie。尝试从 Postman 生成 cUrl 命令(请参阅链接)。 cUrl 非常可靠。我们遇到了 Postman 不发送 cookie 的问题。 getpostman.com/docs/postman/sending_api_requests/…
    猜你喜欢
    • 2014-02-28
    • 2011-03-16
    • 1970-01-01
    • 2012-11-22
    • 2017-09-02
    • 2016-05-12
    • 2014-04-06
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多