在Roku上提出要求后,没有看到任何Cookie

如何解决在Roku上提出要求后,没有看到任何Cookie

我有一个Roku应用,它将在视频播放时对后端服务进行几次异步调用。 可能 其中的某些通话可能会同时发生。这些调用都依赖Cookie进行身份验证。

由于调用依赖于Cookie进行身份验证,因此我需要利用单个roUrlTransfer对象。如果我为每个请求创建一个新的roUrlTransfer实例,则它们将不会共享Cookie缓存

但是,因为可能同时发生两个调用,所以我不能使用单个roUrlTransfer对象。根据{{​​3}}:

每个roUrlTransfer对象一次只能执行一个异步操作。启动异步操作后,您将无法使用该对象执行任何其他数据传输操作,直到异步操作完成为止(如收到roUrlEvent消息所示),该消息的GetSourceIdentity值与roUrlTransfer的GetIdentity值相匹配。

要解决这两个问题,我创建了一个包装对象。我维护一个称为“ cookieJar”的单例roUrlTransfer对象,然后每个请求启动一个新的roUrlTransfer实例:

' ********************************************************************
' ** URL class to streamline adding query parameters and making requests.
' ********************************************************************

Function Downloader() As Object
   return {
      Send: Downloader_Send
      AsyncWait: Downloader_AsyncWait
   }
End Function

Function CookieJar() As Object
   if m.cookiejar = invalid
      m.cookiejar = CreateObject("roUrlTransfer")
      m.cookiejar.EnableCookies()
   end if
   return m.cookiejar
End Function

Function Downloader_Send(req={} As Object)
   if req.url <> invalid
      m.req = req

      m.http = CreateObject("roUrlTransfer")
      m.port = CreateObject("roMessagePort")
      m.http.SetPort(m.port)
      m.http.EnableEncodings(true)

      ' ParseURL is a helper function I wrote that just breaks a URL into
      ' its components: scheme,host,path,query,and fragment
      m.url = ParseURL(req.url)
      m.http.EnableCookies()
      m.http.AddCookies(CookieJar().GetCookies(m.url.host,m.url.path))

      m.http.SetUrl(req.url)

      if req.method <> invalid
         m.http.SetRequest(req.method)
      else
         m.http.SetRequest("GET")
      end if

      if req.timeout <> invalid
         m.timeout = req.timeout
      else
         m.timeout = 5000
      end if

      data = {}

      if req.body <> invalid
         if m.http.AsyncPostFromString(FormatJSON(req.body))
            data = m.AsyncWait()
         end if
      else
         if m.http.AsyncGetToString()
            data = m.AsyncWait()
         end if
      end if

   end if

   return data
End Function

Function Downloader_AsyncWait() As Dynamic
   event = wait(m.timeout,m.port)
   if type(event) = "roUrlEvent"
      print "Headers:"
      print event.GetResponseHeaders()
      print "Adding cookies to cookie jar:"
      print m.http.GetCookies(m.url.host,m.url.path)
      print m.http.GetCookies("","/")
      CookieJar().AddCookies(m.http.GetCookies(m.url.host,m.url.path))
      return {
         statusCode: event.GetResponseCode()
         error: event.getFailureReason()
         body: event.GetString()
         headers: event.GetResponseHeaders()
      }
   else if event = invalid
      m.http.AsyncCancel()
   end if
   return invalid
End Function

为了测试我的代码,我启动了一个非常简单的ExpressJS服务器,该服务器除了设置cookie外什么也不做:

var express = require("express");
var cookieParser = require("cookie-parser");
var app = express();
app.use(cookieParser());

app.get("/",function (req,res) {
    res.cookie("key","value",{
        domain: "192.168.1.102:3333",path: "/",expire: Date.now() + 3600000
    });
    res.send("Done");
});

var server = app.listen(3333,function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log("Example app listening at http://%s:%s",port);
});

然后在我的Roku应用程序中(在主屏幕上),我有以下内容:

httpClient = Downloader()

httpClient.Send({
    ' My local IP address
    url: "http://192.168.1.102:3333"
})

在Roku上运行此命令时,在调试日志中看到以下内容:

Headers:
<Component: roAssociativeArray> =
{
    connection: "keep-alive"
    content-length: "13"
    content-type: "text/html; charset=utf-8"
    date: "Tue,11 Aug 2020 17:29:52 GMT"
    etag: "W/"d-w+Ote5otCKx40dtR446Vz7wX66U""
    set-cookie: "key=value; Path=/"
    x-powered-by: "Express"
}
Adding cookies to cookie jar:
<Component: roArray> =
[
]
<Component: roArray> =
[
]

m.http.GetCookies(m.url.host,m.url.path)m.http.GetCookies("","/")均未返回任何cookie。但是您可以在标题中清楚地看到Cookie!那我为什么不能访问它?

请注意,m.url.host192.168.1.102:3333m.url.path (空白),以防万一。

解决方法

经过一整天的研究,我发现Roku无法正确处理Cookie域中的 端口 。当192.168.1.102:3333提供Cookie时,Roku在内部将Cookie标记为属于192.168.1.102(无端口)。

这有两个含义:

  1. 如果为cookie提供了...; domain=...;属性,并且该域包含端口,则Roku完全无法解析set-cookie标头,并且不会提取任何cookie
  2. 如果不提供此属性,则Roku将解析set-cookie标头,但是GetCookies()仅在没有域的情况下返回cookie({{1} }或指定了无端口域。 ""返回cookie,但GetCookies("192.168.1.102","/")不返回

因为我的代码的目的是在多个roUrlTransfer实例之间共享Cookie,所以可以使用GetCookies("192.168.1.102:3333","/")获取所有 Cookie,因此我们将修改后端以删除GetCookies("","/")标头中的...; domain=...;属性

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-