本文章主要介绍使用httpclient通过HTTPS加密上传文件。
为了比较好理解,由两个工程来实现这个功能:
服务端:multiuploadserver
服务端证书生成及配置可参考我之前的博客:
JAVA keytool数字证书生成及应用
需要注意的是,在生成keystore时:‘CN(Common Name名字与姓氏)’ 的值必须与服务端URL中的名称一致。
比如所访问的服务器端的URL为:https://localhost:8443/test,则CN值必须为localhost。
配置完成后,就可编写服务端代码了(这部分可参考
spring3.0多文件上传)
只要在此
spring3.0多文件上传基础上加入web.xml配置即可(这个在
JAVA keytool数字证书生成及应用中已有说明):
<security-constraint>
<web-resource-collection>
<web-resource-name>HtmlAdaptor</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description>Protection should be CONFIDENTIAL</description>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
客户端:multiuploadClient
客户端操作:
首先访问服务器URL(基于IE),会提示安装证书,点击‘查看证书’--》‘详细信息’--》复制到文件。将证书保存到本地。
此处导出位置为multiuploadClient工程src目录下,证书文件名为multi.cer。
然后进入命令行窗口(确定配置好了JAVA环境):
(1) cd 保存的证书所在目录
(2) 输入:keytool -import -keystore client.keystore -storepass 111111 -alias client -file multi.cer
storepass必须证书密码一致。
正确导入证书之后,就可编写代码了:
package com.client.ctl;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.security.KeyStoreException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
public class UploadFileCtl {
HttpClient httpClient = new DefaultHttpClient();
MultipartEntity multipartEntity = new MultipartEntity();
/**
* getHttpClient
* @return
*/
public HttpClient getHttpClient() {
return httpClient;
}
/**
* getMultipartEntity
* @return
*/
public MultipartEntity getMultipartEntity() {
return multipartEntity;
}
/**
* 获得KeyStore
* @param uri
* @param storepass
* @return
*/
public KeyStore getKeyStore(String uri, String storepass) {
System.out.println("getKeyStore****************");
KeyStore keyStore = null;
try {
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
} catch (KeyStoreException e) {
e.printStackTrace();
System.out.println("Failed to create keystore");
}
FileInputStream fis = null;
try {
fis = new FileInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("File read exception");
}
try {
keyStore.load(fis, storepass.toCharArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return keyStore;
}
/**
* 获得SocketFactory
* @param keyStore
* @return
*/
public SocketFactory getSocketFactory(KeyStore keyStore) {
System.out.println("getSocketFactory****************");
SocketFactory socketFactory = null;
try {
socketFactory = new SSLSocketFactory(keyStore);
} catch (Exception e) {
e.printStackTrace();
}
return socketFactory;
}
/**
* 配置连接信息
* @param name
* @param SocketFactory
* @param port
*/
public void registryScheme(String name, SocketFactory SocketFactory,
int port) {
System.out.println("registryScheme****************");
Scheme scheme = new Scheme(name, SocketFactory, port);
httpClient.getConnectionManager().getSchemeRegistry().register(
scheme);
}
/**
* 获得HttpPost
* @param uri
* @return
*/
public HttpPost getHttpPost(String uri) {
System.out.println("getHttpPost****************");
HttpPost httpPost = new HttpPost(uri);
System.out.println("executing request:" + httpPost.getRequestLine());
return httpPost;
}
/**
* 添加文件主体
* @param name
* @param fileBody
*/
public void addFileBody(String[] name ,FileBody[] fileBody) {
for (int i = 0; i < name.length; i++) {
System.out.println("addContentBody:"+name[i]);
multipartEntity.addPart(name[i], fileBody[i]);
}
}
/**
* 设置请求实体multipartEntity
* @param httpPost
*/
public void setEntity(HttpPost httpPost) {
System.out.println("setEntity****************");
httpPost.setEntity(multipartEntity);
}
/**
* 执行请求
* @param httpUriRequest
* @return
*/
public HttpResponse executeRequest(HttpUriRequest httpUriRequest) {
System.out.println("executeRequest****************");
HttpResponse httpresponse = null;
try {
httpresponse = httpClient.execute(httpUriRequest);
} catch (Exception e) {
e.printStackTrace();
}
return httpresponse;
}
/**
* 关闭连接,释放所有资源
*/
public void closeConnection() {
System.out.println("closeConnection****************");
httpClient.getConnectionManager().shutdown();
}
public static void main(String[] args) {
UploadFileCtl ufc = new UploadFileCtl();
KeyStore keyStore = ufc.getKeyStore(
"G:/workspace/multiuploadClient/src/client.keystore", "111111");
SocketFactory socketFactory = ufc.getSocketFactory(keyStore);
ufc.registryScheme("https", socketFactory, 8443);
HttpPost httpPost = ufc
.getHttpPost("https://localhost:8443/multiuploadserver/multiuploadController/uploadFile");
ufc.addFileBody(
new String[]{"file","file"},
new FileBody[]{
new FileBody(new File("G:/workspace/multiuploadClient/src/multi.cer")),
new FileBody(new File("G:/workspace/multiuploadClient/src/client.keystore"))
}
);
ufc.setEntity(httpPost);
/***********************************************************************/
HttpResponse httpresponse = ufc.executeRequest(httpPost);
ufc.closeConnection();
System.out.println("\n-------------------------------------------------------------\n");
HttpEntity httpentity = httpresponse.getEntity();
System.out.println("StatusLine:" + httpresponse.getStatusLine());
if (httpentity != null) {
System.out.println("------------------Response content start------------------------");
try {
InputStream in = httpentity.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(in));
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("--------------------Response content end----------------------");
System.out.println("Response Content-Type: "
+ httpentity.getContentType());
try {
httpentity.consumeContent();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
代码完成后,首先将multiuploadserver工程部署到JBOSS下,启动JBOSS,然后运行客户端代码即可。
分享到:
相关推荐
在Java编程中,Apache HttpClient库是一个非常常用的工具,用于...以上就是使用Apache HttpClient进行文件上传的基本流程和技术细节,以及相关的Servlet处理部分。在实际开发中,还需要根据具体需求进行调整和优化。
3. **文件上传步骤**: - **创建HttpClient对象**:首先,我们需要实例化一个`CloseableHttpClient`对象,它是HttpClient的主要入口点。 - **构建HttpPost请求**:然后,通过`HttpPost`类创建一个HTTP POST请求,...
HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。
这个库为开发者提供了高级功能,例如异步处理、连接池管理和自定义请求方法,包括POST方式的文件上传。当我们需要通过网络上传头像或者文件时,HTTPClient提供了一个方便的解决方案。以下是关于这个主题的详细知识点...
此外,Spring Framework的RestTemplate或WebClient也可以轻松处理文件上传。 总结,使用Apache Commons HttpClient进行文件上传涉及构建POST请求,设置文件内容,然后发送并处理响应。理解这些步骤对于任何需要与...
9. **文件上传与下载**:使用MultipartEntityBuilder或FileEntity进行文件上传,通过HttpGet下载文件。 10. **性能优化**:如重用连接、压缩数据传输、减少内存消耗等优化技巧。 11. **错误处理**:捕获和处理HTTP...
HttpClient是Apache开源组织提供的一款强大的HTTP客户端库,它允许开发者在Java环境中发送HTTP请求并接收响应,广泛应用于数据交换、文件上传下载等场景。 首先,我们需要了解HttpClient的基本用法。HttpClient支持...
3. `httpmime-4.5.jar`: 如果你需要发送或者接收带有MIME类型的HTTP请求(例如上传文件),则需要这个库。 4. `commons-logging-1.2.jar`: 用于日志记录,HTTPClient依赖这个库来输出调试信息。 在Spring MVC中,...
在Java编程语言中,实现多文件上传是一项常见的任务,尤其在网络应用中,如文件共享、云存储服务等。本文将详细讲解如何在Java环境中实现这一功能,并探讨相关的知识点。 首先,多文件上传涉及到的主要技术点有HTTP...
8. **文件上传与下载**:学习如何通过HttpClient发送文件,以及接收大文件的下载流处理。 9. **性能优化**:分析HttpClient的性能瓶颈,运用最佳实践提升请求处理速度。 10. **与其他框架集成**:例如,将...
服务端通常使用Servlet或Spring MVC等框架来接收和处理HttpClient的请求。以下是一个简单的Servlet示例,用于处理文件上传: ```java @WebServlet("/upload") public class UploadServlet extends HttpServlet { ...
在文件上传时,HttpClient允许将文件内容作为请求体的一部分发送,这通常是通过MultipartEntityBuilder或者FormBodyPart来实现的,它们可以封装文件流并设置适当的边界以符合多部分表单数据的格式。 服务端部分则在...
本项目结合了SpringMVC的多数据源配置和HttpClient的文件上传功能,实现了复杂的企业级应用需求。在实际开发中,根据业务场景的不同,可能还需要处理更多细节,如数据源的负载均衡、错误处理和日志记录等。理解和...
如果你正在使用Spring框架,Spring MVC提供了一套更高级的API来处理文件上传。`MultipartFile`接口是Spring MVC中用于处理上传文件的核心类。你可以在控制器方法的参数中声明`MultipartFile`,Spring会自动将其填充...
- 文件上传下载:HttpClient支持PUT和GET方法,适合处理大文件的上传和下载。 - 自动化测试:在编写自动化测试脚本时,HttpClient可以帮助模拟真实用户行为。 6. 最佳实践: - 使用连接池:通过设置合适的连接池...
HttpClient库是由Apache软件基金会开发的,广泛应用于各种网络通信场景,包括数据的获取、上传、下载等。本篇文章将详细介绍如何使用HttpClient进行HTTP请求,并提供一个完整的Java代码实例。 首先,我们需要引入...
在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...
Commons FileUpload库简化了这一过程,处理了文件大小限制、多部分表单数据解析等问题,使得开发者能更安全、高效地实现文件上传功能。 4. **JSTL**: JSP Standard Tag Library,即JSTL,是一组标准标签库,用于...