最近做了许多获取文件的coding。现总结如下:
在与银行进行交互的过程中,经常需要互相传送文件。文件的生成会根据业务逻辑在一天内的某个时刻,并且文件每天一更新,所以我们在文件传输的过程中首要的任务是保证在规定的时间内将文件传输给相关人员。
文件传输逻辑有两种方式,定时传输和手动传输。
定时传输,可以采用spring的定时组件,通过配置xml文件的形式,定时执行某个Action,实现每日定时传输功能。这种方式能够通过日志查看到每日文件是否发送成功,如果发送不成功原因是什么,以便程序员定期维护。
手动传输,采用文件名的方式获取服务器上相应文件,然后将其通过邮件或输入流的方式放入到另一台服务器上。手动传输方式需要一个前台页面,接收需要接收文件名称或文件名称的一部分,然后拼接成一个文件名。
由于测试环境和生产环境存在差异,常常会遇到测试环境为http协议可以获取到文件,而到了生产环境就为https,连接超时(time out)。这和我们访问一个https网站浏览器要求我们确认是否访问的原理一样。我们需要在连接之前,将其设置为“可信”。代码如下:
private static class TrustAnyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
关键的类是TrustAnyHostnameVerifier ,有了它方法verify的return true,我们可以轻松的绕过https不可信的认证。