设为首页 收藏本站
查看: 401|回复: 0

[经验分享] Apache HttpClient Demo

[复制链接]

尚未签到

发表于 2016-12-30 06:21:16 | 显示全部楼层 |阅读模式
一 建立web服务HttpServer。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>HttpServer</display-name>
<filter>
<filter-name>UserPermissionFilter</filter-name>
<filter-class>filter.UserPermissionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserPermissionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<display-name>LoginServlet</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<display-name>PostXMLServlet</display-name>
<servlet-name>PostXMLServlet</servlet-name>
<servlet-class>servlet.PostXMLServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PostXMLServlet</servlet-name>
<url-pattern>/PostXMLServlet</url-pattern>
</servlet-mapping>
</web-app>

login.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="post">
username:<input type="text" name="username"/><br/>
password:<input type="password" name="password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>

main.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>This is the main page.</h1>
</body>
</html>

UserPermissionFilter.java

package filter;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class UserPermissionFilter implements Filter {
private String[] excludedUri={"/HttpServer/LoginServlet",
"/HttpServer/PostXMLServlet"};
public void destroy() {}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest=(HttpServletRequest) request;
if(!Arrays.asList(excludedUri).contains(httpRequest.getRequestURI())){
String user=(String) httpRequest.getSession().getAttribute("user");
if(user==null||"".equals(user)){
request.getRequestDispatcher("/login.jsp")
.forward(request, response);
return;
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {}
}

LoginServlet.java

package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
if("admin".equals(username)&&"admin".equals(password)){
request.getSession().setAttribute("user", username);
response.getWriter().write("Login Success!");
}else{
response.sendRedirect("/HttpServer/login.jsp");
}
}
}

PostXMLServlet.java

package servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PostXMLServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(request.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}

HttpServer用于接收客户端请求。除了请求路径/HttpServer/LoginServlet和/HttpServer/PostXMLServlet都要做用户校验。如果校验为通过则返回login.jsp页面。

二 客户端测试
要引入外部jar包 httpclient-4.2.3.jar httpcore-4.2.2.jar commons-logging-1.0.4.jar

1.测试用户登录
LoginClient.java

package http.client;
import http.Utils;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
public class LoginClient {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
/* initialize the request method */
// prepare the request url
HttpPost httpPost = new HttpPost("http://localhost:7070/HttpServer/LoginServlet");
// prepare the request parameters
List<NameValuePair> params=new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username","admin"));
params.add(new BasicNameValuePair("password","admin"));
// set the request entity
httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
/* execute the request */
System.out.println("executing request " + httpPost.getURI());
HttpResponse response = httpclient.execute(httpPost);
/* check whether it has relocated */
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY ||
statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
statusCode == HttpStatus.SC_SEE_OTHER ||
statusCode == HttpStatus.SC_TEMPORARY_REDIRECT){
Header[] headers = response.getHeaders("location");
if (headers != null) {
httpPost.releaseConnection();
String newUrl = headers[0].getValue();
httpPost.setURI(URI.create(newUrl));
response = httpclient.execute(httpPost);
}
}
/* print the result of the request */
Utils.printResponse(response);
// Do not feel like reading the response body
// Call abort on the request object
httpPost.abort();
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}

如果传入的用户名密码正确那直接返回login success成功信息,否则返回login.jsp页面。
2. 通过2次请求直接访问main.jsp页面。第一次请求用户登录,第二次请求则访问main.jsp
RequestMainClient.java

package http.client;
import http.Utils;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
public class RequestMainClient {
@SuppressWarnings("deprecation")
public static void main(String[] args)throws Exception {
HttpClient httpclient = new DefaultHttpClient();
/* execute login operation */
// prepare the request url
HttpPost httpPost = new HttpPost("http://localhost:7070/HttpServer/LoginServlet");
// prepare the request parameters
List<NameValuePair> params=new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username","admin"));
params.add(new BasicNameValuePair("password","admin"));
// set the request entity
httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
System.out.println("executing request " + httpPost.getURI());
HttpResponse response =httpclient.execute(httpPost);
/* request main page */
httpPost.releaseConnection();
httpPost=new HttpPost("http://localhost:7070/HttpServer/main.jsp");  
response = httpclient.execute(httpPost);
/* print the result of the request */
Utils.printResponse(response);
// Do not feel like reading the response body
// Call abort on the request object
httpPost.abort();
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}

如果第一次请求登录成功则第二次请求可以直接访问main.jsp, 否则第二次将会返回login.jsp

3.提交实体数据(这里为xml文件)
PostXMLClient.java


package http.client;
import http.Utils;
import java.io.File;
import java.net.URL;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
public class PostXMLClient {
public static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
/* initialize the request method */
// prepare the request url
HttpPost httpPost = new HttpPost("http://localhost:7070/HttpServer/PostXMLServlet");
URL url=PostXMLClient.class.getClassLoader().getResource("http/fruits.xml");
File file=new File(url.getFile());
System.out.println(file.exists());
httpPost.setEntity(new FileEntity(file,ContentType.TEXT_XML));
/* execute operation */
System.out.println("executing request " + httpPost.getURI());
HttpResponse response =httpclient.execute(httpPost);
/* print the result of the request */
Utils.printResponse(response);
// Do not feel like reading the response body
// Call abort on the request object
httpPost.abort();
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}

fruits.xml

<?xml version="1.0" encoding="UTF-8"?>
<fruits>
<fruit>
<name>apple</name>
<price>10</price>
</fruit>
<fruit>
<name>orange</name>
<price>4</price>
</fruit>
</fruits>

Utils.java

package http;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
public class Utils {
public static void printResponse(HttpResponse response)throws Exception{
/* print the result of the request */
HttpEntity entity = response.getEntity();
System.out.println("--------------------");
// print the status line
System.out.println(response.getStatusLine());
// print the headers
System.out.println("========== headers ==========");
Header[] headers=response.getAllHeaders();
for(Header header:headers){
System.out.println(header);
}
// print the content length
if (entity != null) {
System.out.println("\nResponse content length: "+
entity.getContentLength());
}
// print the entity content
System.out.println("\n========== response content ==========");
BufferedReader is=new BufferedReader(
new InputStreamReader(entity.getContent()));
String line=null;
while((line=is.readLine())!=null){
System.out.println(line);
}
System.out.println("--------------------");
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-321177-1-1.html 上篇帖子: Lighttpd+Squid+Apache 下篇帖子: Subversion + Apache + TortoiseSVN
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表