我正在尝试使用Jenkins的REST API。 Jenkins要求对URL进行POST请求才能删除作业。结果如下:
这对Postman来说很好用(当然,除非我禁用“自动跟随重定向”)。 但是,Jersey在第5步一直遇到“ 404”,因为我阻止了匿名用户查看该文件夹。 (如果我完全阻止了匿名用户,则为“ 403”。) 请注意,身份验证在步骤1中有效,因为作业已成功删除!
我的印象是,Jersey应该对所有与客户端有关的请求使用给定的身份验证。 有没有一种方法可以真正实现这一目标?我真的不想只为了自己做每个重定向而禁止重定向。
澄清一下:问题在于,尽管Jersey遵循了重定向,但是又无法再次对其进行身份验证,从而导致服务器拒绝了第二个请求。
有问题的代码:
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-Found”只有5个标题:日期,X-Content-Type-Options(“ nosniff”),位置,Content-Length(0)和服务器。因此,Postman可能会使用的任何cookie或令牌都不会忽略Jersey。
与this one松散相关的问题-如果我能够记录第二个请求,则我也许能够了解幕后发生的事情。
EDIT2 :我还确定问题显然出在身份验证上。如果我允许匿名用户查看有问题的文件夹,错误将消失并且服务器将回答200。
答案 0 :(得分:1)
我在Paul Samsotha和Gautham的帮助下找到了答案。
TL; DR::这是预期的行为,您必须设置系统属性http.strictPostRedirect=true
使其起作用,或您自己执行第二个请求。< / p>
也如here所述,HttpURLConnection
决定不实施HTTP标准中定义的重定向,而是由许多浏览器实施重定向(因此,通俗地说,“像其他人一样而不是应该如何工作”)。这导致以下行为:
通过删除所有标头,身份验证失败。由于Jersey默认情况下使用此类,因此导致我遇到的行为。