如何通过Jolie服务的操作设置http cookie?

时间:2019-01-01 22:16:32

标签: cookies jolie

我需要通过Jolie服务的操作向浏览器设置Cookie,但找不到有关如何执行操作的信息。

我检查了https://jolielang.gitbook.io/docs/protocols/httphttps://jolielang.gitbook.io/docs/web-applications/rest-apis-publication-and-integration处的文档,但似乎我介绍的用例尚未涉及。

inputPort MyIP {

    Protocol: http {
    ...
    ??? -> myCookie;
    ...
    }
    Interfaces: LoginInterface
}

main {

    [login(credentials)(res) {
    ...  
    myCookie=???  
    ...  
    }]
}

我希望在浏览器cookie存储区中看到该cookie。

2 个答案:

答案 0 :(得分:1)

您在正确的轨道上。Cookie的设置是通过使用MDN Reference所示的返回标题信息来进行的。

要在Jolie中操作响应头,您需要在http端口配置的.addHeader节点上进行操作 这是我的代码

interface MyInterface {

    RequestResponse:
     login(undefined)(undefined)
    }

    inputPort MyPort {
    Location: "socket://localhost:8000"
    Protocol: http {
      .debug= true;
      .debug.showContent= true;
      .addHeader.header[0] = "Set-Cookie";
      .addHeader.header[0].value->cookieCommand
    }
    Interfaces: MyInterface
    }

    execution{ concurrent }
    main{
      [login(request)(response){
          //doing something to control my credatiol
          cookieCommand = "yummy_cookie=myCookieValue "
        }]
    }  

您如何阅读此代码

  .addHeader.header[0] = "Set-Cookie";
  .addHeader.header[0].value->cookieCommand

此部分在响应标头中添加“ Set-Cookie”标头,该标头将具有变量cookieCommand作为值;符号->是structure alias

现在您可以在我的示例中的任何操作行为中都可以在登录操作

中设置变量cookieCommand。
      [login(request)(response){
          //doing something to control my credatiol
          cookieCommand = "yummy_cookie=myCookieValue "
        }]

下图显示了通话结果

Response Header

这是浏览器上的结果

Application Cookie Value

现在让我们看看如何处理传入的cookie。首先,我们可以定义一个新操作op1

interface MyInterface {
RequestResponse:
 login(undefined)(undefined),
 op1(op1RequestType)(op1ResponseType)
}

在请求类型中,我们需要添加一个新节点,其中将包含我们的应用程序cookie值

type op1RequestType:void{
  .cookieValue:string
}

然后,我们需要设置Http inputPort接收到的cookie值与操作输入变量之间的匹配

inputPort MyPort {
Location: "socket://localhost:8000"
Protocol: http {
  .debug= true;
  .debug.showContent= true;
  .addHeader.header[0] = "Set-Cookie";
  .addHeader.header[0].value->cookieCommand;
  .osc.op1.cookies.yummy_cookie = "cookieValue"
}
Interfaces: MyInterface
}

端口配置参数

.osc.op1.cookies.yummy_cookie = "cookieValue"

读作osc。(nameOperation).cookies.nameCookie = nameNodeInTheType

让我们看看来自浏览器的呼叫

Sending Cookie

和操作中的跟踪( jolie --trace

Jolie Trace

希望有帮助

答案 1 :(得分:1)

读写cookie

您可以使用cookies参数,该参数将cookie名称映射到消息中存在的字段。

例如,.cookies.auth_token = "token"将名为auth_token的cookie绑定到消息中的字段token(包括读写)。

这是一个完整的示例,其中login操作在浏览器中设置cookie auth_token

execution { concurrent }

inputPort Server {
Location: "socket://localhost:8080"
Protocol: http
  // Binds the cookie "auth_token" to the message field "token"
  { .cookies.auth_token = "token" }
RequestResponse: login
}

main
{
  login( request )( response ) {
    if ( request.pwd == "secret" )
      response << "OK" { .token = new }
    else
      response << "Invalid pwd" { .token = "" }
  }
}

您可以通过浏览http://localhost:8080/login?pwd=secret来尝试。


奖金:具有关联集的Cookie

使用这样的cookie可以将它们与工作流结合起来,以对process-aware web applications进行编程。这是带有以下工作流程的更详细的示例:

  1. 用户登录;
  2. 如果登录成功,则可以随意调用操作say,直到调用操作logout为止。
  3. 用户注销。

我正在使用下面的相关集来跟踪会话。

include "console.iol"

execution { concurrent }

type LoginRequest:void { .token?:string .pwd:string }
type TokenMessage:void { .token:string }
type SayRequest:void { .token:string .msg:string }

interface ServerIface {
RequestResponse:
  login(LoginRequest)(TokenMessage) throws InvalidPwd,
  say(SayRequest)(void),
  logout(TokenMessage)(TokenMessage)
}

inputPort Server {
Location: "socket://localhost:8080"
Protocol: http { .cookies.auth_token = "token" }
Interfaces: ServerIface
}

cset {
  token: SayRequest.token TokenMessage.token
}

main
{
  login( request )( response ) {
    if ( request.pwd == "secret" )
      response.token = csets.token = new
    else
      throw( InvalidPwd )
  };
  provide
    [ say( request )() {
      println@Console( csets.token + " says " + request.msg )()
    } ]
  until
    [ logout()( response ) { response.token = "" } ]
}

要尝试,您可以依次浏览以下链接:

  1. http://localhost:8080/login?pwd=secret
  2. http://localhost:8080/say?msg=Hello
  3. http://localhost:8080/logout

参考文献: