【问题标题】:Session variables in Jersey (Java/JBoss)Jersey 中的会话变量 (Java/JBoss)
【发布时间】:2018-08-29 07:11:55
【问题描述】:

我正在使用 Jersey 和 JBoss 用 Ja​​va 开发 RESTful Web 服务,我需要像在 PHP 中一样存储“会话变量”。维护客户端的会话,但不使用 cookie。

@Context
private UriInfo context;

@Context
private HttpServletRequest httpRequest;

@Path("/firstPage")
@GET
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
public String createInstance(@QueryParam("instance") String inst) 
        throws JSONException 
{
    // Here I "declare" the session variable
    HttpSession session = httpRequest.getSession(true);
    session.setAttribute("instance", inst);

    // Creation of the DTO (Data Transfer Object)
    JSONObject innerObj = new JSONObject();
    JSONObject outterObj = new JSONObject();

    innerObj.put("ContactID", "{{Contact.Id}}");
    innerObj.put("EmailAddress", "{{Contact.Field(C_EmailAddress)}}");
    outterObj.put("recordDefinition", innerObj);

    return outterObj.toString();
}

@Path("/secondPage")
@GET
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
public String validateInstance(@QueryParam("instance") String inst) 
        throws JSONException 
{
    // Here I "validate" the session variable
    HttpSession session = httpRequest.getSession(true);
    if ((String)session.getAttribute("instance") == inst) {
        JSONObject obj= new JSONObject();

        outterObj.put("status", 200);
        outterObj.put("instance", inst);

        return obj.toString();
    } else {
        JSONObject obj = new JSONObject();
        obj.put("error", 401);
        return obj.toString();
    }
}

这是我所做的,但它没有按我预期的那样工作。有什么解决办法吗?

【问题讨论】:

  • 注入HttpServletRequest并使用getSession()获取HttpSession。在 that 上设置你的属性。请注意,在后台,cookie 用于维护会话。这就是会话的工作方式。
  • @PaulSamsotha 我将@Context private HttpServletRequest httpRequest; 放在开头,然后将HttpSession session = httpRequest.getSession(); session.setAttribute("instance", inst); 设置为会话属性。但是当我试图得到它时,什么也没有发生。 HttpSession session = httpRequest.getSession(); String instance = (String)session.getAttribute("instance");
  • 你用什么来测试?尝试将true 作为参数传递给getSession(true)
  • @PaulSamsotha 我更新了代码,所以你现在可以看到它的样子。
  • 你用什么客户端来测试?发生的情况是响应中发送了一个 JSESSIONID cookie。客户端需要将该 cookie 发回,否则将找不到会话。

标签: java jboss jersey glassfish session-variables


【解决方案1】:

正如 somone 已经指出的那样:会话是由一个 cookie 处理的,该 cookie 包含 php 用来将客户端连接到会话的会话 ID。

为您的 java rest 服务。根据定义,会话不是休息服务的一部分,甚至不鼓励。

其余架构请参考现场原文档:https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

5.1.3 无状态

接下来我们为客户端-服务器交互添加一个约束:通信本质上必须是无状态的,......从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用任何存储的服务器上的上下文。因此,会话状态完全保留在客户端上。

是否有任何理由反对在请求之间获取创建的数据并将它们附加到第二个请求?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-02-07
    相关资源
    最近更新 更多