我从React.js开始,我想做一个简单的表单,但在文档中我找到了两种方法.
在第一种是使用参考文献:
var CommentForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var author = React.findDOMNode(this.refs.author).value.trim();
var text = React.findDOMNode(this.refs.text).value.trim();
if (!text || !author) {
return;
}
// TODO: send request to the server
React.findDOMNode(this.refs.author).value = '';
React.findDOMNode(this.refs.text).value = '';
return;
},
render: function() {
return (
<form className="commentForm" onSubmit={this.handleSubmit}>
<input type="text" placeholder="Your name" ref="author" />
<input type="text" placeholder="Say something..." ref="text" />
<input type="submit" value="Post" />
</form>
);
}
});
Run Code Online (Sandbox Code Playgroud)
和第二个是使用状态的阵营部件内部:
var TodoTextInput = …
Run Code Online (Sandbox Code Playgroud) 看着这个,我认为是永恒的.Record是用于表示"javascript不可变对象"的数据结构,但我想一次更新多个字段,而不是每次都创建几个对象调用set.
我想做这样的事情
class LoginContext extends Immutable.Record(
{ logged : false, loading: false, error: false, user: null}){
}
var loginContext = new LoginContext()
var anotherContext = loginContext.set({'logged':'true', 'error':'false'})
Run Code Online (Sandbox Code Playgroud)
我读到你无法将对象传递给Record.set()以获得API一致性:
与此库和ES6中的set的其他用途保持一致.Map和Set的集合不能接受对象,因为它们的键可以是任何东西,而不仅仅是字符串.记录必须包含字符串,但保持API一致非常重要.
而且我知道我可以使用:
var anotherContext = loginContext.withMutations(function (record) {
record.set('logged','true').set('error','true');
});
Run Code Online (Sandbox Code Playgroud)
还有另一种方式或者我滥用记录?
首先,我假设一个后端控制输入以防止XSS漏洞.
在这个答案中 @Les Hazlewood解释了如何在客户端保护JWT.
假设所有通信都有100%TLS - 在登录期间和登录后的所有时间 - 通过基本身份验证使用用户名/密码进行身份验证并在交换中接收JWT是一个有效的用例.这几乎就是OAuth 2的一个流程('密码授权')的工作方式.[...]
您只需设置Authorization标头:
Run Code Online (Sandbox Code Playgroud)Authorization: Bearer <JWT value here>
但是,话虽如此,如果您的REST客户端是"不受信任的"(例如支持JavaScript的浏览器),我甚至不会这样做:HTTP响应中可通过JavaScript访问的任何值 - 基本上任何标头值或响应正文值 - 可以通过MITM XSS攻击嗅探和截获.
最好将JWT值存储在仅安全的纯http cookie中(cookie config:setSecure(true),setHttpOnly(true)).这可以保证浏览器:
- 只通过TLS连接传输cookie,
- 永远不要将cookie值用于JavaScript代码.
这种方法几乎是您为最佳实践安全所需要做的一切.最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.
最简单的方法是使用随机值(例如UUID)设置仅安全(但不是仅限http)cookie.
我不明白为什么我们需要具有随机值的cookie来确保启动对您站点的请求的外部域无法运行.使用同源策略时,这不是免费的吗?
来自OWASP:
检查Origin Header
Origin HTTP Header标准是作为防御CSRF和其他跨域攻击的方法而引入的.与引用者不同,源将出现在源自HTTPS URL的HTTP请求中.
如果存在原始标头,则应检查其是否一致.
我知道OWASP本身的一般建议是同步器令牌模式,但我看不出剩下的漏洞是什么:
更新1: 同源策略仅适用于XMLHTTPRequest,因此恶意站点可以轻松地生成表单POST请求,这将破坏我的安全性.需要显式的原始标头检查.等式将是:
我一直在使用React + Flux应用程序中的乐观更新,并看到两件事:
因此,我致力于此并创建一个ActionStore来管理由组件触发的操作的状态.这是源代码,这是一个现场演示.
它的工作方式或多或少是这样的:
我这样做主要是为了将"实体"的状态与动作的状态分开,但允许具有相同有效负载的重新触发操作(如果服务器临时关闭或者如果我们收到500响应状态,这可能很有用用户松动的信号).
此外,拥有操作存储允许在用户注销或关闭窗口之前轻松询问它们是否为待处理操作.
注意:我正在使用针对Rest API的单应用程序页面Web应用程序,我不认为在服务器端呈现时使用它
这是一个可行的选择创建一个ActionStore或我打破一些Redux/Flux基础?这可能会结束使用React Hot Reloading和Time travel的可能性吗?
你应该毫不留情地回答,我可能做了一堆丑陋的事情,但我正在学习React/Redux.
几天以来,我一直试图弄清楚如何告知其余的微服务,在微服务A中创建一个新实体,将该实体存储在MongoDB中.
我想要:
微服务之间的耦合很低
避免像两阶段提交(2PC)这样的微服务之间的分布式事务
起初像RabbitMQ这样的消息代理似乎是一个很好的工具,但后来我看到了在MongoDB 中提交新文档并在代理中发布消息而不是原子的问题.
为何选择活动?by eventuate.io:
解决此问题的一种方法意味着通过添加一个标记来说明文档的模式有点脏,该标记表明文档是否已在代理中发布,并且具有在MongoDB中搜索未发布文档的预定后台进程,并使用这些文档将这些文档发布到代理确认,当确认到达时,文档将被标记为已发布(使用at-least-once和idempotency语义).这个解决方案在此提出并且这个答案.
阅读Chris Richardson 的微服务简介我最后在这个关于开发功能域模型的伟大演示中,其中一个幻灯片询问:
如何在没有2PC的情况下自动更新数据库并发布事件和发布事件?(双写问题).
答案很简单(在下一张幻灯片中)
更新数据库并发布事件
这是一种不同的方式来这一个是基于CQRS一拉Greg Young的.
域存储库负责发布事件,这通常在单个事务内部,同时将事件存储在事件存储中.
我认为委托将事件存储和发布到事件存储的责任是一件好事,因为避免了2PC或后台进程的需要.
然而,以某种方式它的真实是:
如果您依赖事件存储来发布事件,那么您将与存储机制紧密耦合.
但是,如果我们采用消息代理来进行微服务的交互,我们可以说同样的话.
令我担心的是,事件存储似乎成为单点故障.
如果我们从eventuate.io看这个例子
我们可以看到,如果事件存储已关闭,我们无法创建帐户或资金转移,失去了微服务的优势之一.(虽然系统将继续响应查询).
因此,确认eventuate示例中使用的事件存储是单点故障是正确的吗?
Akka docs表示默认调度程序是一个fork-join-executor
因为它"在大多数情况下都能提供出色的性能".
我想知道为什么会这样?
ForkJoinPool与其他类型的ExecutorService的不同之处主要在于使用工作窃取:池中的所有线程都尝试查找和执行提交给池的任务和/或由其他活动任务创建的任务(如果不存在则最终阻止等待工作) .这使得(1)在大多数任务产生其他子任务(如大多数ForkJoinTasks)时有效处理,以及(2)当许多小任务从外部客户端提交到池时.特别是在构造函数中将asyncMode设置为true时,ForkJoinPools也可以(3)适用于从未加入的事件样式任务.
起初,我猜Akka不是案例(1)的一个例子,因为我无法弄清楚Akka如何分配任务,我的意思是,在许多任务中可以分叉的任务是什么?
我认为每条消息都是一个独立的任务,这就是为什么我认为Akka与case(2)类似,其中消息是许多小任务(通过!和?)提交给ForkJoinPool
.
下一个问题虽然与akka没有严格关系,但是,为什么ForkJoinPool
fork_joinPool会使fork和join(允许工作窃取的主要功能)的用例仍然没有被使用?
从Fork Join Pool的可扩展性
我们注意到上下文切换的数量异常,超过每秒70000.
那一定是问题所在,但究竟是什么原因造成的呢?Viktor提出了合格的猜测,它必须是线程池执行器的任务队列,因为它是共享的,并且LinkedBlockingQueue中的锁可能会在存在争用时生成上下文切换.
但是,如果Akka不使用ForkJoinTasks
,则外部客户端提交的所有任务都将在共享队列中排队,因此争用应与in中的相同ThreadPoolExecutor
.
所以,我的问题是:
ForkJoinTasks
(案例(1))还是与案例(2)有关?ForkJoinPool
如果外部客户端提交的所有任务都被推送到共享队列并且不会发生工作窃取,为什么在情况(2)中是有益的?正确答案来自johanandren,但我想补充一些亮点.
现在,在(IIRC)JDK 7u12之前,ForkJoinPool有一个全局提交队列.当工作线程用尽本地任务以及窃取任务时,他们到达那里并试图查看外部工作是否可用.在这种设计中,对于由ArrayBlockingQueue支持的常规ThreadPoolExecutor没有任何优势.[...]
现在,外部提交进入其中一个提交队列.然后,没有工作的工作人员可以首先查看与特定工作者关联的提交队列,然后四处寻找其他人的提交队列.人们也可以称之为"偷工作".
因此,这可以在未使用fork join的情况下窃取工作.正如Doug Lea所说
当许多客户提交大量任务时,吞吐量大大提高.(我已经测量了高达60倍的speedupson微基准测试).我们的想法是以与工人类似的方式对待外部提交者 - 使用随机排队和转发.(这需要一个大的内部重构todisassociate工作队列和工作人员.)这也大大提高了所有任务异步并提交到池而不是分叉的吞吐量,这成为构建actor框架的合理途径,以及许多你可能使用的普通服务ThreadPoolExecutor for.
对于FJP来说,4%确实不多.你还需要注意FJP的权衡:FJP让线程旋转一段时间,以便能够更快地处理准时到达的工作.这确保了在许多情况下的良好延迟.特别是如果您的池过度配置,那么在几乎空闲的情况下,权衡时间与更多功耗有关.
我想从Stormpath帖子中对JWT令牌和CSRF提出疑问,解释将JWT存储在localStorage或cookies中的优缺点.
[...]如果你使用JS从cookie中读取值,这意味着你不能在cookie上设置Httponly标志,所以现在你站点上的任何JS都可以读取它,从而使它完全相同的安全性 - 作为在localStorage中存储内容的级别.
我试图理解为什么他们建议将xsrfToken添加到JWT.是不是将JWT存储在cookie中然后将其解压出并将JWT放在HTTP头中并根据HTTP头验证请求与Angular的X-XSRF-TOKEN完成相同的操作?如果您根据标头中的JWT进行身份验证,则其他域无法代表用户发出请求,因为其他域无法从cookie中提取JWT.我不了解JWT中xsrfToken的目的 - 也许它只是一个额外的防御层 - 这意味着攻击者必须在您的站点上拥有受损的脚本,并且当时CSRF必须是用户.所以他们必须以两种方式击中你以便能够进行攻击.
帖子在这个答案中链接说:
最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.
[...]然后,在每次进入服务器的请求中,确保您自己的JavaScript代码读取cookie值并将其设置在自定义标头中,例如X-CSRF-Token,并验证服务器中每个请求的值.外部域客户端无法为您的域的请求设置自定义标头,除非外部客户端通过HTTP选项请求获得授权,因此任何CSRF攻击尝试(例如在IFrame中,无论如何)都将失败.
即使他们可以设置自定义标头,他们也无法访问存储JWT令牌的cookie,因为只有在同一域上运行的JavaScript才能读取cookie.
唯一可行的方法是通过XSS,但如果存在XSS漏洞,JWT中的xsrfToken也会受到影响,因为在可信客户端域中运行的恶意脚本可以访问cookie中的JWT,并在请求中包含xsrfToken的标头.
所以等式应该是:
如果客户端和服务器在不同的域中运行,则服务器应发送JWT,客户端应使用JWT创建cookie.我认为这个等式对这种情况仍然有效.
更新: MvdD同意我的意见:
由于浏览器不会自动将标头添加到您的请求中,因此它不容易受到CSRF攻击
我们有一个模式,其中分区键将是一个日期(yyyy-MM-dd),我们正在考虑选择此分区键的文本和日期之间的数据类型.
一种数据类型是否提供了另一种数据类型的优势?它们在查询/存储方面有何不同?
这是一个示例模式.
CREATE TABLE test.user_sessions (
sess_date date (or text),
sess_starttime timestamp,
event_type text,
total_req int,
ended_at timestamp
PRIMARY KEY (sess_date, sess_starttime)
);
Run Code Online (Sandbox Code Playgroud) Cassandra允许您为整个表设置default_time_to_live属性。标记有常规TTL的列和行如上所述进行处理;但是当记录超过表级TTL时,Cassandra会立即将其删除,而不会导致逻辑删除或压缩。
这里也回答
如果表上具有default_time_to_live,则超过此时间限制的行将立即删除,而不会写入逻辑删除。
并在LastPickle的帖子中有关删除和墓碑中进行了评论
探索的另一个线索是,如果合适的话,可以使用TTL作为默认值。在表级别使用'default_time_to_live'设置的TTL 在C * 3.0 +中根本不会产生任何逻辑删除。尚未经过我的测试,但我读到了这件事。
我已经做了我可以想象的最简单的测试LeveledCompactionStrategy
:
CREATE KEYSPACE IF NOT EXISTS temp WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
CREATE TABLE IF NOT EXISTS temp.test_ttl (
key text,
value text,
PRIMARY KEY (key)
) WITH compaction = { 'class': 'LeveledCompactionStrategy'}
AND default_time_to_live = 180;
Run Code Online (Sandbox Code Playgroud)
cassandra ×2
cookies ×2
csrf ×2
javascript ×2
jwt ×2
reactjs ×2
akka ×1
cors ×1
cqrs ×1
flux ×1
forkjoinpool ×1
immutable.js ×1
java ×1
owasp ×1
redux ×1
threadpool ×1