Java代码下载其他系统的文件时,需要有:登陆链接、密码、账户和下载链接;
在登陆之时,需要对url进行转码,使得后台提交不能出现乱码(根据自身实际情况进行设置转码格式)。只需要每次请求携带cookie值,并且将请求参数携带即可,如下案例下载时有token需要将值携带才可进行下载
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.io.IOUtils;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.io.*;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 文件导出
*/
public class FileExport {
public static void main(String[] args) {
try {
//文件存储路径
String Filepath = "E:/resource/";
FileExport r = new FileExport();
//r.prjectInfoExp(Filepath);
r.dingdanExcel(Filepath);
} catch (Exception e) {
}
}
/**
* @param Filepath 文件导出路径
*/
public void prjectInfoExp(String Filepath) {
//获取加密key
String saltUrl = "http://127.0.0.1:20000/uac_oa/getSalt?r=" + Math.random();
// 登陆 Url
String loginUrl = "https://127.0.0.1/doPrevLogin?r=" + Math.random();
//获取token
String tokenUrl = "http://127.0.0.1/ssoModule?appId=CHNTPMS&appAcctId=432805";
//下载链接
String dataUrl = "http://127.0.0.1:27183/pmsexport/cn.chinatowercom.pms.sso.ssoAuth.flow?isNewbusiness=&pro_manager=&siteId=&ifDivideDes=&ifDivideSupvis=";
//创建协议
HttpClient httpClient = new HttpClient();
//设置编码格式
httpClient.getParams().setContentCharset("UTF-8");
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
// 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
try {
/************获取加密key***********/
//进行请求获取加密key
PostMethod postSalt = new PostMethod(saltUrl);
//发起请求
int statusCode = httpClient.executeMethod(postSalt);
//获取到加密key
String salt = postSalt.getResponseBodyAsString().replace("\"", "");
/************登录***********/
System.out.println("登录。。。");
//加密后的账户和密码
String username = encode("zhaolf3", salt);
String password = encode("Lizzard2018", salt);
// 设置登录请求参数
NameValuePair[] data = {
new NameValuePair("csrftoken", ""),
new NameValuePair("username", username),
new NameValuePair("password", password),
new NameValuePair("remember", "true"),
new NameValuePair("rememberPwd", "false"),
new NameValuePair("loginFrom", "oa"),
new NameValuePair("fp", "8d6b2e0dffb43ce2d1ee5855cc83946f"),
new NameValuePair("useragent", "Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:66.0)+Gecko/20100101+Firefox/66.0")};
//登录请求
PostMethod postLogin = new PostMethod(loginUrl);
//加入请求参数
postLogin.setRequestBody(data);
//发起登录请求
httpClient.executeMethod(postLogin);
// 获得登陆后的 Cookie
StringBuffer tmpcookieLogin = new StringBuffer();
Cookie[] cook = httpClient.getState().getCookies();
for (Cookie c : cook) {
tmpcookieLogin.append(c.toString() + ";");
//System.out.println("cookies = " + c.toString());
}
/************获取跳转所需的token***********/
System.out.println("获取跳转所需的token。。。");
PostMethod postToken = new PostMethod(tokenUrl);
postToken.setRequestHeader("cookie", tmpcookieLogin.toString());
httpClient.executeMethod(postToken);
// 获得登陆后的 Cookie
StringBuffer cookieToken = new StringBuffer();
Cookie[] cook_1 = httpClient.getState().getCookies();
for (Cookie c : cook_1) {
cookieToken.append(c.toString() + ";");
//System.out.println("cookies = " + c.toString());
}
//获取到Token
String token = postToken.getResponseBodyAsString().split("token=")[1].split("&")[0];
/************进行下载文件信息文件***********/
System.out.println("下载文件。。。");
long startTime = System.currentTimeMillis();
// 进行下载请求
PostMethod postMethos = new PostMethod(bianma(dataUrl + "&token=" + token));
// 每次访问需授权的网址时需带上前面的 cookie 作为通行证
postMethos.setRequestHeader("cookie", cookieToken.toString());
postMethos.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/66.0");
//文件接收类型
postMethos.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
postMethos.setRequestHeader("Content-Type", "text/html; charset=UTF-8");
postMethos.setRequestHeader("Accept-Encoding", "gzip, deflate");
httpClient.executeMethod(postMethos);
//设置下载文件名称
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String fileName = "*********" + format.format(new Date()) + ".xlsx";
Header[] headers = postMethos.getResponseHeaders();
InputStream inputStream = postMethos.getResponseBodyAsStream();
//将输出流转换问字节
byte[] getData = readInputStream(inputStream);
//存储文件名称
File file = new File(Filepath + File.separator + fileName);
FileOutputStream fos = new FileOutputStream(file);
//将字节输出到文件中
fos.write(getData);
long endTime = System.currentTimeMillis();
System.out.println("文件下载所需时间:" + (endTime - startTime));
if (inputStream != null) {
inputStream.close();
}
if (fos != null) {
fos.close();
}
if (inputStream != null) {
inputStream.close();
}
System.out.println("info:下载成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("info:下载失败");
}
}
/**
* 从输入流中获取字节数组
*
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
/**
* url进行转码 防止有中文在出现乱码
*
* @param url
* @return
*/
public static String bianma(String url) {
//被转码后的url
String result = "";
//需要转码的url
int index = url.indexOf("?");
result = url.substring(0, index + 1);
String temp = url.substring(index + 1);
try {
//URLEncode转码会将& : / = 等一些特殊字符转码,(但是这个字符 只有在作为参数值 时需要转码;例如url中的&具有参数连接的作用,此时就不能被转码)
String encode = URLEncoder.encode(temp, "utf-8");
System.out.println(encode);
encode = encode.replace("%3D", "=");
encode = encode.replace("%2F", "/");
encode = encode.replace("+", "%20");
encode = encode.replace("%26", "&");
result += encode;
return result;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* DES加密
*
* @param datasource 为加密字符
* @param key 密钥key
* @return
*/
public String encode(String datasource, String key) {
try{
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key.getBytes());
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在,获取数据并加密
byte[] temp = Base64.encodeBase64(cipher.doFinal(datasource.getBytes()));
return IOUtils.toString(temp, "UTF-8");
} catch (Throwable e) {
e.printStackTrace();
return null;
}
}
/**
* DES解密
*
* @return
*/
public String decode(String src, String key) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return IOUtils.toString(cipher.doFinal(Base64.decodeBase64(src.getBytes())), "UTF-8");
}
}