当渲染类型为“contentType:text / json”时设置cookie

时间:2010-02-03 06:11:48

标签: grails groovy

当返回呈现类型设置为json时,是否可以在响应时设置cookie?

我可以在使用标准渲染类型返回时在响应对象上设置cookie,稍后,我可以在后续请求中将其恢复。但是,如果我在将返回值渲染为json时设置cookie,我似乎无法在下一个请求对象上取回cookie。这里发生了什么?

当用户点击提交时,这两个操作按预期工作,'basicForm'执行操作的常规表单帖子'withRegularSubmit'。

// first action set the cookie and second action yields the originally set cookie
def regularAction = {
  // using cookie plugin
  response.setCookie("username-regular", "regularCookieUser123",604800); 
  return render(view: "basicForm");
}

// called by form post
def withRegularSubmit = {
  def myCookie = request.getCookie("username-regular"); 
  // returns the value 'regularCookieUser123'
  return render(view: "resultView");
}

当我在使用json从响应返回之前切换到设置cookie时,我没有使用帖子返回cookie。

请求首先获取包含表单的html文档,当触发doc load事件时,通过javascript调用以下请求,如下所示:

var someUrl = "http://localhost/jsonAction";
$.get(someUrl, function(jsonData) { // do some work with javascript}

控制器工作:

// this action is called initially and returns an html doc with a form. 
def loadJsonForm = {
  return render(view: "jsonForm");
}

// called via javascript when the document load event is fired
def jsonAction = {
  response.setCookie("username-json", "jsonCookieUser456",604800); // using cookie plugin
  return render(contentType:'text/json') { 'pair'('myKey': "someValue") };
}

// called by form post
def withJsonSubmit = {
  def myCookie = request.getCookie("username-json"); 
  // got null value, expecting: jsonCookieUser456
  return render(view: "resultView");
}

由于用户按下“提交”按钮而不是通过脚本,数据将返回到服务器。在提交'withRegularSubmit'和'withJsonSubmit'之前,我看到存储在浏览器中的cookie(Firefox),所以我知道它们已经到达了客户端。

1 个答案:

答案 0 :(得分:0)

我意识到问题所在 - cookie插件没有为cookie设置路径,因此它存储了“server / controller / action”,而在随后的请求中,当我要求cookie时,插件返回与新请求的路径关联的cookie。

调整插件代码,以便使用统一路径存储cookie。