【问题标题】:Creating a cookie inside a jax-rs endpoint在 jax-rs 端点内创建 cookie
【发布时间】:2015-04-29 11:22:25
【问题描述】:

我有一个 jax-rs 端点。端点的目的是授权用户。我需要在 cookie 中登录详细信息。下面我已经提到了我的代码的相关部分。

public Response authorize(@Context HttpServletRequest request) throws URISyntaxException {
     if (authnResult.isAuthenticated()) {
     //TODO create a cookie to maintain login state
                        Cookie authCookie = new Cookie(FrameworkConstants.COMMONAUTH_COOKIE, "test");
                        authCookie.setSecure(true);
                        authCookie.setHttpOnly(false);
                        authCookie.setMaxAge(5 * 60);
}

编辑:

这是我第一次创建 cookie。我遵循了一些教程。在这些教程中,它已将创建的 cookie 添加到响应中。但是在端点内部我无法访问响应。那么如何创建cookie呢?请给我建议。

更新代码:

public Response authorize(@Context HttpServletRequest request) throws URISyntaxException {
    NewCookie cookie = new NewCookie("CookieName","CookieValue");
                    Response.ResponseBuilder builder = Response.ok("Cool Stuff");
                    builder.cookie(cookie);
                    Response response=builder.build();
    Cookie[] cookies = request.getCookies();
}

我需要知道的是如何访问新创建的cookie。

【问题讨论】:

    标签: java cookies jax-rs endpoint


    【解决方案1】:

    您可以创建一个javax.ws.rs.core.NewCookie。有很多不同的构造函数,只需查看 API 文档即可。

    然后你可以通过ResponseBuilder#cookie(NewCookie)添加cookies。比如:

    @GET
    public Response getCookie() {
        NewCookie cookie = new NewCookie("Name", "Value", "path", "domain",
                                         "comment", 300, true, true);
        ResponseBuilder builder = Response.ok("Cool Stuff");
        builder.cookie(cookie);
        return builder.build();
    }
    

    更新(带有完整示例)

    @Path("cookie")
    public class CookieResource {
        
        @GET
        public Response getCookie(@CookieParam("A-Cookie") String cookie) {
            Response response = null;
            if (cookie == null) {
                response = Response.ok("A-Cookie: Cookie #1")
                        .cookie(new NewCookie("A-Cookie", "Cookie #1"))
                        .build();
                return response;
            } else {
                String cookieNum = cookie.substring(cookie.indexOf("#") + 1);
                int number = Integer.parseInt(cookieNum);
                number++;
                String updatedCookie = "Cookie #" + number;
                response = Response.ok("A-Cookie: " + updatedCookie)
                        .cookie(new NewCookie("A-Cookie", updatedCookie))
                        .build();
                return response;
            }
        }
    }
    

    38次请求后,就可以看到结果了。我使用了一个 Firefox 插件Firebug。可以看到发送的 cookie #37,返回的 cookie #38

    如果您在尝试从客户端访问 cookie 时需要帮助(如您的评论中所建议的那样),这可能适合关于 SO 的另一个问题。可能是本次讨论的主题,因为它将依赖于另一种技术。如果这不是您想要的,那么更好地解释您想要完成的目标可能会有所帮助。

    【讨论】:

    • 感谢peeskillet的建议。我试试看。
    • 我按照您建议的方式进行操作。我需要使用作为参数传递给方法的 HttpServletRequest 请求来访问创建的 cookie。我尝试使用“request.getCookies()”,但无法访问新创建的 cookie。请给我建议一种方法来做这件事。
    • 如果你的意思是在下一个请求中,你可以使用@CookieParam("...")作为方法参数注解,它会注入cookie值。还有你使用的是什么用户代理。这取决于用户代理是否会发回 cookie。如果您只是使用浏览器,它应该可以工作。
    • 是的,我使用浏览器作为代理。我已经更新了代码。请通过提供代码 sn-p 帮助我访问 cookie。很抱歉没有意识到。
    • 根据您的代码,我真的不知道您要做什么?您首先需要访问资源一次,cookie 将被发送到客户端,然后下一个请求,客户端应该将 cookie 发送回来。第一个请求应该没有 cookie 可获取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多