Java HttpURLConnection响应显示为未经授权

Java HttpURLConnection响应显示为未经授权,java,Java,背景: 我们有一个基于Java的桌面应用程序,它调用托管在不同服务器上的ASPX页面,而不需要身份验证 已完成的审判: 我发现这个应用程序在JRE更新到1.8.0_201后开始未经授权/401;当我将其切换回JRE 1.8.0141时,一切正常 我使用RESTClient解雇了同样的人;我看到请求已发送到该网站 代码示例: //Create connection url = new URL(targetURL); connection = (HttpURL

背景:

我们有一个基于Java的桌面应用程序,它调用托管在不同服务器上的ASPX页面,而不需要身份验证

已完成的审判:

  • 我发现这个应用程序在JRE更新到1.8.0_201后开始未经授权/401;当我将其切换回JRE 1.8.0141时,一切正常
  • 我使用RESTClient解雇了同样的人;我看到请求已发送到该网站

    代码示例:

     //Create connection      
          url = new URL(targetURL);
          connection = (HttpURLConnection)url.openConnection();
          connection.setRequestMethod("POST");
          connection.setRequestProperty("Content-Type", 
               "application/xml");
          connection.setRequestProperty("Content-Language", "en-US");
          connection.setUseCaches (false);
          connection.setDoInput(true);
          connection.setDoOutput(true);
          OutputStreamWriter out;
          out = new OutputStreamWriter(connection.getOutputStream());     
          out.write("<?xml version=\"1.0\"?>\r\n");
          out.write("<methodCall>\r\n");
          out.write("  <project>" + "<![CDATA["+"Pla"+"]]>" + "</project>\r\n");
          out.write("</methodCall>\r\n");     
    
    你能帮我解决这个问题吗


    以下是两个JRE的一些内容: JRE_1.8.0_201: 2019年3月27日下午1:20:45 sun.net.www.protocol.http.HttpURLConnection getServerAuthentication 更精细:AuthenticationHeader的服务器身份验证:首选NTLM返回null

    JRE_1.8.0_131: ar 272019 11:28:35 AM sun.net.www.protocol.http.HttpURLConnection getServerAuthentication FINER:AuthenticationHeader的服务器身份验证:首选NTLM返回sun.net.www.protocol.http.NTLM。NTLMAuthentication@728938a9
    2019年3月27日上午11:28:35 sun.net.www.protocol.http.HttpURLConnection plainConnect0我建议您检查用户代理头的值。例如,尝试将其设置为“Mozilla/5.0”。

    我建议您检查用户代理标题的值。例如,尝试将其设置为“Mozilla/5.0”。

    我们在HttpURLConnection和这个特定的1.8.0_201 jre中遇到了类似的问题,身份验证失败,并且有一个“authentication:Basic xxyyy”头。 我们的场景是,服务器首先回答“301永久移动”,httpurlconnection使用新提供的url正确重试请求,但“身份验证”头丢失,因此我们针对401运行

    有趣的事实:当设置标题时,如下所示:

    connection.setRequestProperty("Authorization ", "Basic " + authString);
    

    (请参阅标题名称后的附加空格)它起作用了,因此我认为“Authentication”标题的过滤器是一种预期行为,并且实现得不好;-)

    我们在HttpURLConnection和这个特定的1.8.0_201 jre中遇到了类似的问题,身份验证失败,并且有一个“authentication:Basic xxyyy”头。 我们的场景是,服务器首先回答“301永久移动”,httpurlconnection使用新提供的url正确重试请求,但“身份验证”头丢失,因此我们针对401运行

    有趣的事实:当设置标题时,如下所示:

    connection.setRequestProperty("Authorization ", "Basic " + authString);
    


    (请参阅标题名称后的附加空格)它起作用了,因此我认为“Authentication”标题的过滤器是一种预期行为,并且实现得不好;-)

    不需要身份验证的服务器-那么401从哪里来?是的,如前所述,服务器中没有任何更改。只有JRE更新会弹出这个问题。@chandra-澄清一下-一切都保持不变-除了JRE版本,没有任何变化?那么它一定与JRE有关:用户代理头值是否更改?这可能会导致WAF(例如mod_security)错误被传播备份。您可以使用tcpdump/wireshark查看两个JRE的连接情况吗?我在请求中从未使用过用户代理?Java桌面应用程序的值是多少如果您没有在服务器中使用授权,那么如果您没有在服务器上设置CORS筛选器,则会抛出此错误。对于调试,您可以获取输入错误流并读取如下错误:
    InputStreamReader streamReader=new InputStreamReader(connect.getErrorStram())不需要身份验证的服务器-那么401从哪里来?是的,如前所述,服务器中没有任何更改。只有JRE更新会弹出这个问题。@chandra-澄清一下-一切都保持不变-除了JRE版本,没有任何变化?那么它一定与JRE有关:用户代理头值是否更改?这可能会导致WAF(例如mod_security)错误被传播备份。您可以使用tcpdump/wireshark查看两个JRE的连接情况吗?我在请求中从未使用过用户代理?Java桌面应用程序的值是多少如果您没有在服务器中使用授权,那么如果您没有在服务器上设置CORS筛选器,则会抛出此错误。对于调试,您可以获取输入错误流并读取如下错误:
    InputStreamReader streamReader=new InputStreamReader(connect.getErrorStram())能否捕获两个JRE的完整请求和响应并比较其内容?我已更新了两个JRE的响应,并查看NTLM身份验证在case和其他一些值中返回NULL。顺便说一句,您似乎已“升级”到较旧版本的JRE。1.8.0_141工作正常,1.8.0_201给出401。为什么不继续使用141版本?服务器似乎使用NTLM身份验证。可能是您遇到了此错误:?我已切换到Apache库,而不是使用Java urlconnection。您是否可以捕获两个JRE的完整请求和响应,并比较其内容?我已更新了两个JRE的响应,并看到NTLM身份验证在case中返回NULL,其他一些值BTW您似乎已“升级”到较旧版本的JRE。1.8.0_141工作正常,1.8.0_201给出401。为什么不继续使用141版本?服务器似乎使用NTLM身份验证。可能是您遇到了这个错误:?我已经切换到Apache库,而不是使用Java urlconnection。