Jersey客户端:Jenkins重定向时身份验证失败
我正在尝试使用Jenkins的RESTAPI。Jenkins需要向URL发送POST请求才能删除作业。其结果如下:Jersey客户端:Jenkins重定向时身份验证失败,jenkins,jersey,jax-rs,jersey-client,Jenkins,Jersey,Jax Rs,Jersey Client,我正在尝试使用Jenkins的RESTAPI。Jenkins需要向URL发送POST请求才能删除作业。其结果如下: 我告诉我选择的客户将帖子发送到适当的URL。 客户端发送帖子,并使用用户名和密码对自己进行授权 詹金斯删除了这份工作 Jenkins返回一个“302-Found”,其中包含包含已删除作业的文件夹的位置 客户端自动向该位置发送帖子 詹金斯的回答是“200-OK”和文件夹页面的完整HTML 这对邮递员来说很好(当然,除非我禁用了“自动跟踪重定向”)。 然而,Jersey在第5步一直遇到
客户端发送帖子,并使用用户名和密码对自己进行授权
HttpAuthenticationFeature auth = HttpAuthenticationFeature.basicBuilder()
.credentials(username, token)
.build();
Client client = ClientBuilder.newBuilder()
.register(auth)
.build();
WebTarget deleteTarget = client.target("http://[Jenkins-IP]/job/RestTestingArea/job/testJob/doDelete")
Response response = deleteTarget.request()
.post(null);
编辑:根据邮差,“302已找到”只有5个标题:日期、X-Content-Type-Options(“nosniff”)、位置、内容长度(0)和服务器。所以,邮递员不会使用任何饼干或代币,泽西也不会忽视
问题与之松散相关-如果我能够记录第二个请求,我可能能够理解幕后发生的事情
EDIT2:我还确定问题显然在于身份验证。如果我允许匿名用户查看有问题的文件夹,错误将消失,服务器将以200回答。我在和的帮助下找到了答案 TL;DR:这是预期行为,您必须设置系统属性
http.strictPostRedirect=true
使其工作或自己执行第二个请求
如前所述,
HttpURLConnection
决定不实现HTTP标准中定义的重定向,而是实现了许多浏览器(用外行的话说,“像其他人一样做,而不是像它应该如何工作”)。这会导致以下行为:
通过删除所有头,身份验证将失败。由于Jersey在默认情况下使用该类,这会导致我所经历的行为。那么在第一次身份验证之后会发生什么,是否有令牌或cookie被发送回?你还没有真正解释过认证部分是如何成功地与邮递员合作的。嗨,保罗,我不确定我是否理解你对第二部分的意思,因为我对REST的总体经验不是很丰富。授权类型是“Basic Auth”,如果这是您的意思,那么它只是一个用户名和密码。(嗯,“密码”是在服务器上生成的令牌,但它仍然需要基本的授权方式…)我在我的帖子的回复中添加了详细信息-基本上,回复只包含“日期、X-Content-Type-Options、位置、内容长度、服务器”。不幸的是,没有cookie或令牌。Jersey看起来不像是在处理重定向。相反,较低级别的连接器处理它。例如,如果您使用默认的HttpUrlConnection连接器,它有一个方法来设置您是否要遵循重定向,并且它从您设置的Jersey属性中获取该方法。根据我提供的信息,从逻辑上讲,我看不出如果不按照您的建议手动操作,您如何能够实现这一点。其他连接器具有设置重定向的相同选项。因此,要么编写自己的连接器,要么自己手动处理重定向。您如何验证第二个请求(重定向后)也是POST?看起来大多数互联网都是通过将第二个请求转换为GET来工作的,并且删除了头。在这种情况下,您很可能会面临您所面临的问题。您是否也尝试了
http.strictPostRedirect=true
系统属性以查看它是否有效?