Java使用基本授权和重定向进行HTTP POST

3
该程序使用基本授权进行HTTP POST请求,但是当POST请求完成后,页面会被重定向到成功页面。由于401授权失败,重定向失败。
        final URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Authorization", "basic " +base64);
        wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();
        rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

这条线

rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

由于401授权失败,操作失败了...
我还尝试添加

conn.setRequestProperty("Authorization", "basic " +base64);

之后

wr.flush();

我遇到了“已连接”的错误。显然,我设置的授权并没有随着重定向而跟随过去。非常感谢任何解决这个问题的方案。

在设置完标题之后,你的 conn.connect() 调用在哪里? - Nathan Ryan
如果没有已经建立的连接,conn.getOutputStream()会自动连接。 - Subasteve
没意识到这一点。得回去检查一下 URLConnection 的文档。 - Nathan Ryan
2个回答

2

  1. 已弃用。应在获取适当的URLConnection实例后使用特定于实例的setRequestProperty方法。调用此方法将不起作用。而且没错,使用该方法甚至无法通过post请求。
  2. 重定向的整个目的是为了找出响应是否成功,因此禁用重定向没有任何好处。如果成功,它将转到一个页面,否则将转到另一个页面。
- Subasteve
如果禁用重定向,您仍然可以使用getHeaderField读取标头,以检查是否设置了“Location”标头:这将告诉您登录是否成功。 - Femi
1
是的,那个解决方案可行,谢谢。我稍后会发布完整的解决方案。sun.net.www.protocol.http.HttpURLConnection 处理 302 重定向和请求属性时可能存在错误。 - Subasteve

1

这是一个可行的解决方案,适用于任何遇到此问题的人。再次感谢Femi提供的解决方法。

URL url = new URL(page);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setInstanceFollowRedirects(false);
conn.setDoOutput(true);
conn.setRequestProperty("Authorization", "basic " +base64);
wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
if(conn.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP){
    url = new URL(conn.getHeaderField("Location"));
    conn = (HttpURLConnection)url.openConnection();
    conn.setRequestProperty("Authorization", "basic " +base64);
}
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接