小编Sla*_* II的帖子

Google Analytics事件已取消

将Google Analytics事件跟踪附加到页面上的超链接存在严重问题(如文档中所示).

例:

<a
    href="http://www.example.com/"
    onclick="_gaq.push(['_trackEvent', 'Links', 'Click', 'Example Link']);"
>
    Example!
</a>
Run Code Online (Sandbox Code Playgroud)

当用户点击Google Chrome浏览器中的此类链接时,GA开始将请求发送到服务器(事件跟踪),但浏览器也开始加载另一个页面(在链接之后)并且GA请求被"取消" ",因此事件未到达GA服务器,并且未显示在统计信息中.

我们该如何应对呢?

例如,当事件到达GA服务器时,我们可以将导航延迟到链接页面,但是如果GA请求是异步的,我们怎么能这样做呢?我们在文档中找不到任何回调功能.

有没有办法在推送命令执行时得到通知?

javascript google-analytics google-chrome

5
推荐指数
1
解决办法
2810
查看次数

在Ansible中共享多个角色之间的默认值?

我想在Ansible中分享不同角色之间的默认值.是否有可能直接实现这一目标?是否有解决方法,可能是解决此问题的另一种方法?我只想保持默认值DRY.

ansible

5
推荐指数
1
解决办法
1831
查看次数

如何使用NPM更新开发依赖项?

这是我的一部分package.json:

{
    ...
    "devDependencies": {
        "gulp": "~3.8",
        ...
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

我正在运行以下命令:

gulp --version

CLI version 3.8.7
Local version 3.8.6

npm update
gulp --version

CLI version 3.8.7
Local version 3.8.6

rm -Rf ./node_modules/
npm install

gulp --version

CLI version 3.8.7
Local version 3.8.7
Run Code Online (Sandbox Code Playgroud)

npm update命令无效.

只有在我手动删除node_modules目录并运行npm install开发包之后才会更新.这是什么原因?是否有可能在没有这样麻烦的情况下实际更新开发包?

node.js npm

5
推荐指数
1
解决办法
7067
查看次数

如何处理复合微服务请求中的验证?

考虑具有两个实体的应用程序:

  • User (包含基本用户数据,例如名称)
  • Passport (包含身份验证凭据,即密码)

还有两个内部微服务:

  • UserService (负责创建和管理用户及其基本数据)
  • AuthService (负责用户身份验证和密码处理)

User实体属于UserServicePassport实体属于AuthService.

这两个服务应该分开,因为它们解决了截然不同的任务:配置文件数据身份验证.

另外,请考虑我们有一个包含三个字段的注册表:

  • 电子邮件
  • 名称
  • 密码

此表单将触发GatewayService对该应用程序的HTTP请求,该请求拦截对应用程序的所有请求并将它们路由到内部微服务(或组合/聚合它们).

现在,当网关服务收到包含所有表单数据的请求时,它需要执行以下操作:

  1. 调用UserService创建新用户(它将以生成的方式响应userId).
  2. 呼叫AuthService为新创建的用户创建护照.它将需要userId步骤#1中收到的和password原始请求中的字段.

这看起来非常简单,但如果AuthService在步骤#2中不可用会发生什么?我们需要以某种方式分离这些请求!

经典方法是使用最终一致性并Passport通过异步调用创建实体(我们可以将此请求放入队列并在单独的服务中处理它).为了做到这一点,我们将向AuthService传递userIdpassword向它发送异步请求,而不是步骤#2,因此步骤#1将立即返回对客户端的响应.

但是,如果password字段格式不正确(打破验证规则)怎么办?验证逻辑仅出现在AuthService,因此我们无法知道密码是否正确,直到调用它为止.现在,请求是异步处理的,因此我们无法回复用户并告诉他更正密码.

那么,您如何正确处理微服务应用程序的分布式复合请求中的验证?

  1. 天真的解决方案是将验证逻辑移到GatewayService自身,但这是一个糟糕的主意,因为它会使它变胖并且会泄露业务逻辑AuthService.

  2. 另一个想法是提供一种额外的密码验证方法,并在步骤#1和#2之前调用它.它看起来像一个可行的解决方案,但它将迫使我们为我们的微服务中的每个业务方法提供两种方法,一种用于事先验证,一种用于实际操作.此外,验证和操作之间存在时间空间,因此在实际执行操作时,较早的正确值可能会变得不正确.

  3. 我们可以将表单拆分为两个以避免复合请求,并在询问个人数据并为他创建帐户后询问用户密码.但是,这可能会导致安全问题,其中一些其他可能猜到下一个用户的用户可以拦截用户帐户userId.我们可以使用一些额外的安全令牌,但它会为服务引入奇怪的功能,并使整个设置更加复杂.

    此外,这种方法看起来像是试图逃避问题,您不能总是避免复合请求.

  4. 我们可以使用全面的分布式事务,例如2PC,但它会使系统变得非常复杂,并且首先会减少MSA的使用.

  5. 最后的想法是将这两种服务合并在一起,但在微服务架构中这样做是没有意义的.

architecture software-design distributed-transactions microservices

5
推荐指数
1
解决办法
1553
查看次数

将预定义的验证器添加到Angular中的自定义组件

我正在开发一个与Angular中的表单一起使用的自定义组件.我正在实现ControlValueAccessor界面,它工作得很好.

但是,我的组件没有理由在没有required验证器的情况下使用(它是CAPTCHA),因此组件的所有调用都必须指定required验证器.

是否有可能以某种方式将此验证器直接嵌入到我的组件中,因此当与ngModel和表单(基于模板的和被动的)一起使用时,它将始终应用于它?


澄清.考虑这个例子:

<my-captcha [(ngModel)]="firstCaptcha" required></my-captcha>

<my-captcha [(ngModel)]="secondCaptcha" required></my-captcha>

<my-captcha [(ngModel)]="thirdCaptcha" required></my-captcha>
Run Code Online (Sandbox Code Playgroud)

MyCaptcha上面组件的所有调用都必须使用该required属性,以便将所需的验证器应用于表单控件.

是否可以在不明确指定required属性的情况下调用我的自定义控制器,但是仍然应用了验证器?像这样:

<my-captcha [(ngModel)]="captchaValue"></my-captcha>
Run Code Online (Sandbox Code Playgroud)

validation components angular

5
推荐指数
1
解决办法
399
查看次数

CloudFront策略仅使特定的distrubution无效

我正在使用S3存储桶来存储文件,使用CloudFront来分发它们.我有一个自动处理同步的工具,它工作得很好.

但是,我希望能够以编程方式创建CloudFront失效.我需要在工具的策略中添加什么语句才能为此特定分发创建无效?

现在,我有这样的声明:

{
    "Effect": "Allow",
    "Action": [
        "cloudfront:CreateInvalidation"
    ],
    "Resource": "*"
}
Run Code Online (Sandbox Code Playgroud)

但是,正如您所看到的,它允许为帐户中的任何分配创建失效.

我试图将这些值用于Resource属性,但由于某种原因,该工具给了我一个错误,说访问被拒绝:

  • arn:aws:cloudfront::12345678:distribution/ABCDEFG
  • arn:aws:cloudfront:::distribution/ABCDEFG

我需要在Resource属性中指定什么才能允许仅为特定分布创建失效?

arn:aws:cloudfront::12345678:distribution/ABCDEFG例如,这是ARN .

amazon-web-services amazon-cloudfront amazon-iam

5
推荐指数
2
解决办法
1468
查看次数

在 Angular 中保存/恢复路由器状态

当用户到达我的应用程序中受特殊保护的路由时,我将他重定向到登录路由,以执行身份验证。

但是,在成功验证后,我不想将她重定向回她最初到达的路线。

如何在 Angular 中保留中间路由状态然后重定向到它?

通过路由状态,我的意思是:

  • 路线本身,即路径
  • 所有查询字符串参数
  • 一个哈希字符串

angular-routing angular

5
推荐指数
1
解决办法
1386
查看次数

使可观察的行为像RxJS中的promise一样?

考虑到我有一个调用服务器并通过Observable返回用户数据的函数:

getUserById (id: number): Observable<User> {
  return this.http.get('/users/' + id)
    .map(response => response.json())
  ;
}
Run Code Online (Sandbox Code Playgroud)

我如何使其表现得更像诺言?

问题是,只有有人订阅了返回的可观察对象,才会发出请求。另外,完成多个订阅后,服务器将被多次调用。

我想要的是:

  • 在被调用时立即调用服务器getUserById()(订阅应该是可选的,只有在调用者确实想要获取返回值或在请求完成时才知道的情况下)

  • 多个订阅不应产生多个请求,而应返回从服务器获得的相同值

使用这种方法,我将能够使此功能起作用:

refreshUser (): Observable<User> {
  return repository.getUserById(this.currentUser.id)
    .map(user => this.currentUser = user)
  ;
}
Run Code Online (Sandbox Code Playgroud)

调用时refreshUser(),应该发出请求并this.currentUser = user进行评估。如果需要,我可以订阅返回的observable以获得新数据,例如:

// Just refreshes the current user
refreshUser();

// Refreshes the current user and obtains fresh data
refreshUser().subscribe(user => console.log('Refreshed user', user));
Run Code Online (Sandbox Code Playgroud)

我尝试使用publish()refCount()并且share()以不同的组合使用,但是它仅对第一个要求有所帮助(即避免多次调用服务器),但是如何使原始的可观察性变热呢?


更新资料

经过使用不同选项的进一步研究之后,似乎使用getUserById()热解决方案无法解决该问题,因为我在不同级别上有两个映射函数(一对一getUserById()和一对in refreshUser()),并且我需要它们都执行。为了解决这个问题,我需要以某种方式从下到上“推动”可观察对象。看起来每个级别都需要大量样板代码。

在诺言中,它看起来非常简单: …

rxjs reactivex angular

5
推荐指数
1
解决办法
897
查看次数

在 TypeScript (Angular 2+) 中扩展 EventTarget?

有没有办法实际创建一个类,它将扩展EventTarget DOM API 类?

考虑一下,我正在上这门课:

class MyClass extends EventTarget {        

  constructor() {
    super();
  }

  private triggerEvent() {
    this.dispatchEvent(new Event('someEvent'));
  }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试实例化它时,我收到此错误:

  • ERROR TypeError: Failed to construct 'EventTarget': Please use the 'new' operator, this DOM object constructor cannot be called as a function.

看起来这是因为这个 API 需要适当的 ES2015 类才能工作,但我正在将我的代码转换为 ES5 级别。

如果我使用这样的构造函数:

constructor() {
  Reflect.construct(EventTarget, [], MyClass);
}
Run Code Online (Sandbox Code Playgroud)

尝试addEventListener()在实例上调用时出现以下错误:

  • ERROR TypeError: Illegal invocation.

作为副作用,我也收到了这个 TypeScript 编译错误:

  • error TS2377: Constructors for derived classes must contain a 'super' call. …

dom typescript es6-class angular

5
推荐指数
1
解决办法
901
查看次数

克服 SSO 和静默登录的 ITP 或第三方 Cookie 问题

众所周知,WebKit 的 ITP第三方 cookie阻止正在阻止常见的 SSO 技术正常工作。当用户自动登录到新访问的域时,这尤其与 SSO 的所谓静默登录功能相关,该域连接到她已经通过身份验证的某个身份验证服务器(具有活动的“全局”会话)。我相信这通常是使用隐藏的 iframe 和后消息来实现的。

看起来主要的 IAM 提供商已经屈服于这些障碍,只提供有限的功能。例如,Stack Exchange 门户不仅不支持静默登录,而且当您显式单击登录按钮时甚至无法恢复其他门户上的活动会话:

AskUbuntu 无法恢复 StackOverflow 上的活动会话

AskUbuntu 无法自动恢复 StackOverflow 上的活动会话。

所以,我的问题是:

1)。实际上是否有可能在实现 SSO(尤其是静默登录功能)时克服这些限制,而无需将整个浏览器窗口重定向到身份验证服务器?是否可以使用 XHR + CORS 来实现此目的?或者也许其他一些存储机制(例如 LocalStorage、Cache API、Service Workers 等)可以在禁用 cookie 的情况下保留会话?

2)。Google 如何通过 google.com/youtube.com 域解决此问题?看起来他们确实在恢复全局会话时重新加载整个应用程序,但只有当用户实际使用 Google 登录时才会发生这种情况。如果用户未登录,YouTube 不会自行重新加载。他们如何检测用户是否确实获得了全局会话?

authentication cookies cross-domain single-sign-on

5
推荐指数
0
解决办法
529
查看次数