我们正在使用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”策略时,可能我的策略类不再遵循重定向了?
提前谢谢!
吉姆
暂无答案!
目前还没有任何答案,快来回答吧!