【问题标题】:How to set and check cookies wih JAX-RS?如何使用 JAX-RS 设置和检查 cookie?
【发布时间】:2015-03-16 06:12:08
【问题描述】:

我是 RESTful API 的菜鸟,我正在尝试构建一个登录服务,在该服务中我提供电子邮件和密码,如果验证成功 - 存储一个 cookie。 另外,如何检查 cookie(如果已存储)?

如何做到这一点?

@Path("/login")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON})
public Response Login(final String i_LoginDetails) throws JSONException {
    final JSONObject obj = new JSONObject(i_LoginDetails);
    try {
        if (isValidUser(obj.getString("email"), obj.getString("password"))) {
            // Set a cookie
        } else {
            // return error invalid-credentials message
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return Response.ok("TEST").build();
}

我如何检查 cookie(如果已设置)?

【问题讨论】:

    标签: java rest cookies jax-rs


    【解决方案1】:

    您可以执行以下操作:

    • 要存储新的 cookie:

      @GET
      @Path("/login")
      @Produces(MediaType.TEXT_PLAIN)
      public Response login() {
          NewCookie cookie = new NewCookie("name", "123");
          return Response.ok("OK").cookie(cookie).build();
      }
      
    • 要检索 cookie (javax.ws.rs.core.Cookie):

      @GET
      @Path("/foo")
      @Produces(MediaType.TEXT_PLAIN)
      public Response foo(@CookieParam("name") Cookie cookie) {
          if (cookie == null) {
              return Response.serverError().entity("ERROR").build();
          } else {
              return Response.ok(cookie.getValue()).build();
          }
      }
      

      但是,您可能只需要以下值:

      @GET
      @Path("/foo")
      @Produces(MediaType.TEXT_PLAIN)
      public Response foo(@CookieParam("name") String value) {
          System.out.println(value);
          if (value == null) {
              return Response.serverError().entity("ERROR").build();
          } else {
              return Response.ok(value).build();
          }
      }
      

    顺便说一下,你可能想试试下面的代码:

    @GET
    @Path("/logout")
    @Produces(MediaType.TEXT_PLAIN)
    public Response logout(@CookieParam("name") Cookie cookie) {
        if (cookie != null) {
            NewCookie newCookie = new NewCookie(cookie, null, 0, false);
            return Response.ok("OK").cookie(newCookie).build();
        }
        return Response.ok("OK - No session").build();
    }
    

    这会删除浏览器中的 cookie。该行为取决于 JAX-RS 的实现。使用 RESTEasy (JBoss AS 7.0) 和 Google Chrome 可以正常工作。

    【讨论】:

    • 感谢您的回答。所以在我执行每个服务之前,我应该使用: if (cookie == null) { return Response.serverError().entity("ERROR").build(); } else { //执行服务 } 如何从客户端发送 cookieparam?
    • 取决于客户端软件。你用的是什么客户端?例如jQuery、HttpURLConnection
    • 目前我正在测试两者。
    • 如果您使用jQuery.ajax,自动发送cookies(在同一个域中)。使用HttpURLConnection,您只需要一个cookie 处理程序。见stackoverflow.com/a/15546450/870248
    • 如果方法像我认为的那样用@POST 注释,那么第一个示例(登录)中的方法会有什么不同吗?
    猜你喜欢
    • 2018-02-09
    • 2011-03-26
    • 2014-10-03
    • 2013-08-27
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多