小编Dac*_*d3r的帖子

从内容抓取中保护SPA(例如AngularJS)+ Public REST Api

想象一下,您有一个CMS,其中所有CRUD操作都通过REST API处理.

SPA包含一个adminpanel(后端)和另一个前端的单页应用程序.

使用jwt(令牌)从后端保护所有受保护的API调用很容易,但由于所有内容也通过REST API的公共端传递(对于未登录的用户),我想你可能会看到许多网站实际上在偷窃并从您的整个内容喂养:博客文章,类别,产品,页面,侧边栏等...

这是我在SPA中看到的唯一问题,例如AngularJs,那么有没有解决问题的方法呢?是否有可能不仅使用Angular + REST管理/后端系统,而且还可以将它用于前端,而不像我刚才提到的那样面对内容抓取的问题?

如果是,您如何通过您的API防止恶意内容被盗,并仍然使用您网站的内容为您的访问者提供服务?

api rest screen-scraping angularjs

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

如何在 PostgreSQL 9.4+ 中将简单的 json(b) int 数组转换为整数[]

我有一个来自 json 对象的数组:[1, 9, 12]

由于它使用方括号表示法,因为它是直接从 json 对象获取的,所以我无法将其转换为,::integer[]当我尝试使用时,array_agg(jsonb_array_elements(simpleintarray))我收到一条错误消息,说我需要按 id 进行分组,但由于数组不是对象(键/值) )对,但只是简单的整数,我不知道如何以相当有效的方式实现这一点。

从 json 返回上述简单 int 数组的查询是:

SELECT node.*, elem->'permissions' AS group_node_permissions
    FROM node
    LEFT OUTER JOIN
    jsonb_array_elements(my_user_group.node_permissions) elem
    ON elem->>'id' = node.id::text
    ORDER BY node.id
Run Code Online (Sandbox Code Playgroud)

elem->'permissions'理想情况下应该以 Postgres 数组的形式返回{},以便我稍后可以在其上使用该ANY(intarray)函数。

我想避免做多余的低效解决方法,例如用大括号替换方括号,然后转换elem->'permissions'->>整数数组,将其转换为字符串,尽管这可能会起作用。

在伪代码中,我真正需要的是能够得到相同的结果:

SELECT node.*, elem->'permissions'**::integer[]** AS group_node_permissions,

...但是当然由于json 数组与 PostgreSQL 数组格式之间的[]差异{},这会导致错误。

这是我当前的(非常丑陋的解决方案,但有效):

SELECT node.*, replace(replace(elem->>'permissions', '[', '{'),']','}')::integer[] AS group_node_permissions
Run Code Online (Sandbox Code Playgroud)

它将原始的 (jsonb) 转换为(integer[])[1, 9, …

sql arrays postgresql json types

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

在 Go 中直接从文件或字符串执行 SQL 脚本

在我的应用程序的安装脚本中,我正在检查数据库是否包含任何表。如果数据库为空,我想运行 DML 和 DDL SQL 脚本。

它从一个单独的 .sql 文件中读取 SQL 并不重要,所以现在我只是将它直接放入两个字符串 - 一个用于 DDL,一个用于 DML - 并将它们连接起来。

我现在的问题是,当我尝试运行脚本以使用 .Exec(sqlStr) 生成表并将数据插入其中时,我现在收到此错误:

"pq: cannot insert multiple commands into a prepared statement"
Run Code Online (Sandbox Code Playgroud)

我当然可以做一个解决方法。就像是:

sqlStr := sqlDML + sqlDDL
sqlStmtSlice := strings.Split(sqlStr, ";")
for i:= 0; i < len(sqlStmtSlice) i++ {
    // Exec() each individual statement!
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定我是否喜欢这种方法。当然必须有更好的方法来从文件加载 SQL 脚本并执行整个批处理,对吗?你知道吗?

附言。我正在使用 Go 的 PostgreSQL 驱动程序,但我认为这没有任何区别。

编辑

由于当时似乎没有更好的解决方案来完成这项工作,因此我对上面的伪代码做了一些改进,经过测试,似乎工作得很好:

tx, err := db.Begin()

sqlStr := fmt.Sprintf(sqlDML + sqlDDL)
sqlStmtSlice := strings.Split(sqlStr, ";\r")

if err != …
Run Code Online (Sandbox Code Playgroud)

postgresql go

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

对象键与数组查找性能

示例1:

["member1", "member2",...,..., "member100000"]
Run Code Online (Sandbox Code Playgroud)

示例2:

{
    "member1": true, // (doesn't really need values, only keys :/)
    "member2": true,
    "...",
    "member100000": true
}
Run Code Online (Sandbox Code Playgroud)

我将成员存储在每个内容的数组中,如示例 1 所示,但这样做我必须迭代数组中的 49999 个项目,才能找到成员 50000,所以我想简单地检查是否在javascript对象中定义特定的键将是一个更好的方法,虽然我不需要存储值,但只检查键是否未定义?

我需要的是能够检查是否例如。“member50000”作为我的数组中的值存在 - 或作为我的对象中的键。

我做了一些基准测试,但我不确定我是否得出了正确的结论,或者我在比较中是否做错了什么:http://jsperf.com/lolda123

根据上述测试结果,是否可以公平地得出以下结论:将键/值对保存在值为布尔值(true)的对象中,并且执行操作if(obj["member50000"])是性能最佳的选项?即使不存在具有给定键的属性?在我看来,根据我的测试结果,检查密钥本身是否存在,在性能方面似乎要昂贵得多,但检查密钥是否存在,确实是我所需要的。

我不关心值,所以我在这里遗漏了一些东西,或者为什么更好的解决方案似乎是通过键查找值,而不是仅仅在对象内部查找键?

javascript

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

Golang地图,每个值有多个键

请考虑以下XML数据结构:

<MediaItems>
    <item url="media/somefolder/pic1.jpg" id="1">
        <groups>
            <group>1</group>
            <group>2</group>
        </groups>
    </item>
    <item url="media/somefolder/pic2.jpg" id="2">
        <groups>
            <group>3</group>
            <group>7</group>
        </groups>
    </item>
</MediaItems>
Run Code Online (Sandbox Code Playgroud)

由于我的XML数据结构/文件可能扩展到10000或者可能超过100000个媒体项元素,我需要能够在解析的Go地图(或者在这里使用什么结构?)中访问各个项目,就像我们一样map[key]type - 但我需要能够使用url或id作为键,我无法弄清楚如何使用指向相同值的2个键创建地图.

从上面解析的XML数据结构中,我需要在Go中解析它并将其存储在如下类型中:

map[string, string]MediaItem
Run Code Online (Sandbox Code Playgroud)

其中键应该是URL和ID,所以我能够与ID 1做着获得该项目myMap["1"]myMap["media/somefolder/pic1.jpg"].两者都应该返回相应的MediaItem.)

我无法解决如何实现这一点,或者有更好的方法来实现这一点?

dictionary go

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

任何下端总是使用struct字段类型的指针?

最初我认为我只使用可选结构字段的指针,在最初构建它的情况下可能会为零.

随着我的代码的发展,我在我的模型上编写了不同的层 - 用于xml和json(un)编组.在这些情况下,即使是我认为总是需求的字段(Id,Name等)实际上对某些图层来说也是可选的.

最后我在所有字段前放了一个*,所以int变为*int,字符串变为*string等.

现在我想知道我是不是更好地不那么概括我的代码?我本可以复制代码,我发现它相当丑陋 - 但也许比使用指针用于所有struct字段更有效?

所以我的问题是,这是否会变成一种反模式,只是一种糟糕的习惯,或者从性能的角度来看,这种增加的灵活性是否会带来成本?

例如.你能否提出坚持选项A的好理由:

type MyStruct struct {
    Id int
    Name string
    ParentId *int
    // etc.. only pointers where NULL columns in db might occur
}
Run Code Online (Sandbox Code Playgroud)

超过这个选项B:

type MyStruct struct {
    Id *int
    Name *string
    ParentId *int
    // etc... using *pointers for all fields
}
Run Code Online (Sandbox Code Playgroud)

构建结构的最佳实践方法是从纯数据库/列的角度来看,或者例如,如果您有:

func (m *MyStruct) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    var v struct {
        XMLName     xml.Name     `xml:"myStruct"`
        Name        string       `xml:"name"`
        Parent      string       `xml:"parent"`
        Children    []*MyStruct  `xml:"children,omitempty"`
    }

    err := …
Run Code Online (Sandbox Code Playgroud)

go

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

大猩猩Mux正则表达式

我将Golang Gorilla Toolkit中的Mux包用于我的路线。

考虑以下路线:

m.HandleFunc("/admin/install", installHandler).Methods("GET")
m.HandleFunc("/admin/^((?!install).)*$", adminHandler).Methods("GET")
m.HandleFunc("/admin", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)

问题出在中间路线的正则表达式上-无法解释,因此该路线将无法工作!

m.HandleFunc("/admin/{^((?!install).)*$}", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)

大括号{}也不起作用。它只是被忽略,并被视为/ admin /

都没有:

m.HandleFunc("/admin/{_dummy:^((?!install).)*$}", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)

简而言之,我要在这里实现的是首先匹配/ admin / install路由,然后使用正则表达式将该确切的路由从下面的路由中排除,但这是行不通的。

有没有办法在大猩猩mux包中使用正则表达式?

regex go mux gorilla

4
推荐指数
1
解决办法
4417
查看次数

如何将指针"强制转换"回Golang中的值?

我正在使用time.Time作为我的一个结构中的指针.例如

type struct Example{
    CreatedDate *time.Time
}
Run Code Online (Sandbox Code Playgroud)

我正在使用指针,所以如果不存在日期,我可以将nil传递给结构.

然而,这确实存在问题,因为我需要使用time.Since(then)函数,它不接受指针作为参数,但需要时间.时间.

所以...

将"&"放在结构前面很容易,例如.&time.Time,但如果你有一个指针,你怎么能扭转它,回到例如.一种时间.时间?

例如.(不起作用,但可能会让你知道我的意思)

var t *time.Time = &time.Now()
var t2 time.Time = t.(time.Time)
Run Code Online (Sandbox Code Playgroud)

我希望你能提供帮助.这个问题感觉非常愚蠢,因为我在google搜索时找不到任何关于它的信息.我觉得我在这里错过了一些东西;-)

go

4
推荐指数
1
解决办法
6507
查看次数

是否可以在Rust中制作插件扩展挂钩,如WordPress操作?

我即将在Rust中重写一个高度模块化的CMS,所以我的问题是,如果甚至可以让"核心"应用程序设置扩展点(动作/钩子),其他插件/板条箱能够"标签"到.

这样的东西就足够了,但你怎么能在Rust做到这一点?上面的体系结构使用插件注册表,并通过遍历每个插件的主要方法来迭代每个插件的主要方法.但是在Rust中,因为你不能在例如plugin_registry lib crate中拥有全局"模块"变量,我想这不是Rust中的正确思路.

是否有更好,更灵活的方式使"插件"与核心应用程序无缝集成?例如,像WordPress这样的事件调度程序会使用什么?

rust

4
推荐指数
1
解决办法
289
查看次数

对于性能和从 GUI 移动节点来说最好的 PostgreSQL 层次树?

因为我使用的是 PostgreSQL,所以有一个名为ltree的模块的模块,它至少满足我的一个需求,性能(我不知道可扩展性?有人说物化路径树不能很好地扩展..)。

由于我正在开发的应用程序是一个完全围绕大树、节点、子树等构建的 CMS,因此对这些节点进行排队的性能绝对重要,但由于它是一个分层的大型(随着它的增长)树,您正在处理和操作GUI(CRUD),我还希望用户能够拖放以重新排序节点、子树等,同时正确更新数据库中的树(子记录)。

据我了解,在树中移动和重新排序节点/子树并不是 ltree/物化路径树真正的优点,所以我希望您能提供帮助,要么向我指出最好的正确树结构模型为了性能和移动子树和节点,或者也许......如果 ltree 确实不是过去的遗留物但仍然值得使用,那么如何使用 PostgreSQL 的 ltree 模块实现这一点?在这种情况下为什么/为什么不使用ltree?

要求:

  1. 查询性能当然是我的首要任务(所有节点、子树、叶子)。
  2. 树应该支持深层嵌套和排序
  3. 当然,树应该支持成长和扩展
  4. 如果 1 个“万事通”树实现不存在,或者太复杂而不值得,那么从 GUI 重新排序时我可以忍受一点等待时间。

我还在考虑闭包表,又名桥表(很多!),嵌套间隔(不确定我到底理解如何实现它,并且当前没有好的示例或要点?)或 B 树模型。我只是还不太确定,这些将如何满足我的上述 4 个要求。在嵌套间隔中重新组织子树和节点似乎很简单,而且性能似乎不错。很难选择合适的。

因为我确实需要性能(查询/读取性能)、可扩展性、排序,所以我有点认为带有排序顺序的闭包表可能非常接近,但我无法想象闭包表和磁盘空间开销将变得有多大,就像我的树一样并且节点变大。闭包表和可扩展性,我只是不太确定。我担心这个问题是错误的吗?这项任务的最佳解决方案是什么?

postgresql tree move ltree

3
推荐指数
1
解决办法
6097
查看次数

标签 统计

go ×5

postgresql ×3

angularjs ×1

api ×1

arrays ×1

dictionary ×1

gorilla ×1

javascript ×1

json ×1

ltree ×1

move ×1

mux ×1

regex ×1

rest ×1

rust ×1

screen-scraping ×1

sql ×1

tree ×1

types ×1