我正在开发Jenkins插件,现在陷入了试图获取here中所述方法的返回值的问题。
我只想调用此kotlin方法:
@JavaScriptMethod
fun getMonitoredJobsAsJSON(): JSONArray = toJSON(getObjectMapper().writeValueAsString(getMonitoredJobs())) as JSONArray
从果冻脚本中使用以下命令:
<script>
var board = <st:bind value="${it}"/>
board.getMonitoredJobsAsJSON(function(data) {
//
})
</script>
当我在Jenkins服务器上禁用CSRF保护时,这实际上有效,但是我显然不想这样做。启用CSRF保护后,我始终找不到无效的碎屑403错误:
POST http://localhost:8080/$stapler/bound/36dc05fc-c12d-4182-a008-60bcf5c49307/getMonitoredJobsAsJSON 403 (No valid crumb was included in the request)
我知道如何从crumbIssuer
端点检索碎屑以便与Jenkins rest api进行交互,但是我几乎没有发现有关如何使其适用于插件中的装订器请求的资源。
在此先感谢您的帮助。
答案 0 :(得分:1)
几周后,我终于找到了解决方案。
问题是由于某种原因,默认情况下附加到请求的面包屑标头的名称实际上是错误的。如我问题中的屏幕快照所示,它是SELECT id, name FROM test.user
WHERE id between 1 and 3
UNION
SELECT id, name FROM test.user
WHERE id between 5 and 6
,但对于较早版本的Jenkins,实际上应该为Crumb
或Jenkins-Crumb
。
我要做的是找到一种方法,当页面最初加载时,从服务器中检索面包屑和正确的标头名称,然后使用正确的名称将此面包屑标头附加到任何后续标头中xhr请求。
我为面包屑定义了一个实体:
.crumb
然后将此实体作为属性添加到插件:
class RemoteRequestCrumb {
@JsonIgnore private val crumbIssuer: CrumbIssuer? = Jenkins.getInstance()?.getCrumbIssuer()
val fieldName: String? = crumbIssuer?.crumbRequestField
val crumbValue: String? = crumbIssuer?.crumb
}
现在,您可以像其他任何插件属性fun getRemoteRequestCrumb(): JSONObject = toJSON(
SerializationUtils.getObjectWriter().writeValueAsString(RemoteRequestCrumb())
) as JSONObject
一样,从果冻脚本中请求面包屑数据。
最后一步实际上是将正确的标头附加到所有XHR请求:
${it.getRemoteRequestCrumb()}