多线程模式下使用httpclient
多线程同时访问httpclient,例如同时从一个站点上下载多个文件。对于同一个HttpConnection 同一个时间只能有一个线程访问,为了保证多线程工作环境下不产生冲突,httpclient使用了一个多线程连接管理器的类: MultiThreadedHttpConnectionManager,要使用这个类很简单,只需要在构造HttpClient实例的时候传入即可,代码如下:
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
以后尽管访问client实例即可。
参考资料:
httpclient首页: http://jakarta.apache.org/commons/httpclient/
关于NTLM是如何工作: http://davenport.sourceforge.net/ntlm.html
先将我servlet的代码粘贴如下:
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
String portal_username = httpServletRequest.getParameter("portal_username");
String sys_flag = httpServletRequest.getParameter("sys_flag");
System.out.println("==========================");
SysLogin sysLogin = new SysLogin();
Map mapSysInfo = sysLogin.sysInfo(portal_username, sys_flag);
ConfigAnalyze configAnalyze = new ConfigAnalyze();
Map mapInfoSubmit = configAnalyze.getMapSysFlag(sys_flag);
String error_key = (String) mapInfoSubmit.get("error_key"); //关键字
HttpClient client = new HttpClient();
HttpMethod method = getPostMethod(mapSysInfo, mapInfoSubmit);//使用POST方式提交数据
client.executeMethod(method);
//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印返回的信息
System.out.println("=====================");
System.out.println(method.getResponseBodyAsString());
System.out.println("======================");
String rtnFlag = String.valueOf(method.getResponseBodyAsString().indexOf(error_key));
httpServletResponse.getWriter().write(rtnFlag); //通过这句话,可以把rtnFlag传递到页面上,ajax可以获取。即 // alert(rtnStr);可以将其显示出来。
//释放连接
method.releaseConnection();
}
private static HttpMethod getPostMethod(Map mapSysInfo, Map mapInfoSubmit) {
String form_action = (String) mapInfoSubmit.get("form_action"); //form提交的目标页面
String form_username = (String) mapInfoSubmit.get("form_username"); //“用户名称”表单的名字
String form_password = (String) mapInfoSubmit.get("form_password"); //“密码”输入表单的名字
String sys_username = (String) mapSysInfo.get("sys_username"); //用户名
String sys_password = (String) mapSysInfo.get("sys_password"); //密码
PostMethod post = new PostMethod(form_action);
NameValuePair[] data = {
new NameValuePair(form_username, sys_username),
new NameValuePair(form_password, sys_password)
};
post.setRequestBody(data);
return post;
}
我的servlet中有很多变量,可能大家看不明白,但是主要看getPostMethod()方法即可,看此方法是如何请求方法的。
对此,再次对上面文章的作者表示感谢。如果大家有什么其他问题要通过httpclient解决,可以访问apache的官方网站。
多线程同时访问httpclient,例如同时从一个站点上下载多个文件。对于同一个HttpConnection 同一个时间只能有一个线程访问,为了保证多线程工作环境下不产生冲突,httpclient使用了一个多线程连接管理器的类: MultiThreadedHttpConnectionManager,要使用这个类很简单,只需要在构造HttpClient实例的时候传入即可,代码如下:
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
以后尽管访问client实例即可。
参考资料:
httpclient首页: http://jakarta.apache.org/commons/httpclient/
关于NTLM是如何工作: http://davenport.sourceforge.net/ntlm.html
先将我servlet的代码粘贴如下:
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
String portal_username = httpServletRequest.getParameter("portal_username");
String sys_flag = httpServletRequest.getParameter("sys_flag");
System.out.println("==========================");
SysLogin sysLogin = new SysLogin();
Map mapSysInfo = sysLogin.sysInfo(portal_username, sys_flag);
ConfigAnalyze configAnalyze = new ConfigAnalyze();
Map mapInfoSubmit = configAnalyze.getMapSysFlag(sys_flag);
String error_key = (String) mapInfoSubmit.get("error_key"); //关键字
HttpClient client = new HttpClient();
HttpMethod method = getPostMethod(mapSysInfo, mapInfoSubmit);//使用POST方式提交数据
client.executeMethod(method);
//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印返回的信息
System.out.println("=====================");
System.out.println(method.getResponseBodyAsString());
System.out.println("======================");
String rtnFlag = String.valueOf(method.getResponseBodyAsString().indexOf(error_key));
httpServletResponse.getWriter().write(rtnFlag); //通过这句话,可以把rtnFlag传递到页面上,ajax可以获取。即 // alert(rtnStr);可以将其显示出来。
//释放连接
method.releaseConnection();
}
private static HttpMethod getPostMethod(Map mapSysInfo, Map mapInfoSubmit) {
String form_action = (String) mapInfoSubmit.get("form_action"); //form提交的目标页面
String form_username = (String) mapInfoSubmit.get("form_username"); //“用户名称”表单的名字
String form_password = (String) mapInfoSubmit.get("form_password"); //“密码”输入表单的名字
String sys_username = (String) mapSysInfo.get("sys_username"); //用户名
String sys_password = (String) mapSysInfo.get("sys_password"); //密码
PostMethod post = new PostMethod(form_action);
NameValuePair[] data = {
new NameValuePair(form_username, sys_username),
new NameValuePair(form_password, sys_password)
};
post.setRequestBody(data);
return post;
}
我的servlet中有很多变量,可能大家看不明白,但是主要看getPostMethod()方法即可,看此方法是如何请求方法的。
对此,再次对上面文章的作者表示感谢。如果大家有什么其他问题要通过httpclient解决,可以访问apache的官方网站。