使用httpclient时如何重写方法?还需要什么?

7ajki6be  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(244)

我们正在使用httpclient连接一个有很多重定向的网站。
在我们测试了最初的实现之后,我们得到了一个ioexception,但是当我们试图输出关于异常的信息时,比如.getmessage等等,我们得到的只是一个null。
然后我们尝试使用eclipse远程调试(web应用在weblogic上运行)来调试webapp,我们发现当它得到ioexception时,实际上有几个不直接可见的“层”异常。httpclient似乎正在“秘密”处理多个重定向,并且不会触发我们的代码,即使应用程序配置为laxredirect:

CloseableHttpClient httpclient = HttpClients.custom()
            .setRedirectStrategy(new LaxRedirectStrategy())
            .setSSLContext(sslContext)
            .setDefaultRequestConfig(requestConfig)
            .build();

从远程调试来看,在其中一个“隐藏”重定向上,应用程序得到了:

java.net.URISyntaxException: Illegal character in query at index 316:   https://ZZZZZZZZZZZZZZZ.XXXXX.YYY:14430/oam/pages/consent.jsp?state=WDNvK0ltU2plY1J2dkJhSmJBZkV5dz09fi9SQXIrVVk0ZUZ0cW11WU80TEEyMmJibFFBVzNrZm5Jc3dGbHdINy9lTFY5OVhZRll0TzR5Z1hWNjExK3ZPQmZiTmNjcW9sVGVOWWdya3A1bHhmQ3k0REVSRytBbWwvSHlWbjVlUDk4RFoyeXBHZnBBenFOMU5CaDYzV3NTaGlt&scopes=UserProfile.me&client_id=TestClient|eventStack#10103:0,10125:0,10126:0,10205:0,10305:0,10201:0,10117:0|eventFlowControllerStack#ssoFlowController,|authn_try_count#_k=authn_try_count

看起来“非法字符”是“pipe”字符(即“|”)。
然后我发现了这个线索:
httpclient重定向到url时出现空格引发异常
(请参阅“drakes”的文章),其中谈到使用自定义重定向策略并重写createlocationuri()方法,因此我们现在正尝试这样做,用“%7c”替换管道字符(“|”)。
所以我改变了:

CloseableHttpClient httpclient = HttpClients.custom()
            .setRedirectStrategy(new LaxRedirectStrategy())
            .setSSLContext(sslContext)
            .setDefaultRequestConfig(requestConfig)
            .build();

收件人:

CloseableHttpClient httpclient = HttpClients.custom()
            .setRedirectStrategy(new CleanRedirectStrategy())
            .setSSLContext(sslContext)
            .setDefaultRequestConfig(requestConfig)
            .build();

上了一节小班:

class CleanUrlRedirectStrategy extends LaxRedirectStrategy
{

@Override
protected URI createLocationURI( final String orig ) throws ProtocolException
    {
      System.out.println( "++++++++++++++++++++++++++ In CleanUrlRedirectStrategy.createLocationURI V1.01: Entering, orig=[" + orig + "]" );
     String fixed = orig.replaceAll("\\|","%7C"); 

     if ( ! orig.equals( fixed ) )
         {
         System.out.println( "++++++++++++++++++++++++++ In CleanUrlRedirectStrategy.createLocationURI V1.01: FOUND PIPE CHARACTER - Cleaned redirect URL from [" + orig + "] to [" + fixed + "]" );
     } else {
         System.out.println( "++++++++++++++++++++++++++ In CleanUrlRedirectStrategy.createLocationURI V1.01: No PIPE characters found, so did not change orig!!!!" );
     }

 System.out.println( "++++++++++++++++++++++++++ In CleanUrlRedirectStrategy.createLocationURI V1.01: about to RETURN, fixed=[" + fixed + "]" );

 return super.createLocationURI( fixed );
 }
 }// end CLASS CleanUrlRedirectStrategy

当我测试时,我可以看到日志输出,在第一个http.execute()之后,cleanurlredirectstrategy.createlocationuri()被调用了3次,但是它没有找到任何管道字符(这有点出乎意料,因为从我们之前的测试来看,问题似乎是在第二个http.execute()完成时发生的)。
我想我看到了一个http.execute()尝试,但是整个应用程序似乎停止了(我在日志中没有看到任何进一步的输出)。
所以我想知道:我还需要做些什么来让覆盖方法工作吗?
它“感觉”就像,当我把策略从lax策略改为“clean”策略时,可能我的策略类不再遵循重定向了?
提前谢谢!
吉姆

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题