JAVA通过HttpClient实现服务端收发HTTP请求

JAVA服务端实现HTTP请求的方式有很多种(比如常见的socket操作),本文介绍采用Apache Jakarta Common下的子项目HttpClient来实现,个人当时引入此工具包主要为实现单点登录能力

JAVA通过HttpClient实现服务端收发HTTP请求

所属分类: JAVA
专题标签: POST请求 服务端 HTTP

场景描述

关于单点登录场景有很多解决,比如常见的CAS统一鉴权中心,但这依赖于一个统一的CAS服务。
而本文当时所遇到的场景是,鉴权中心仅能提供一个接口供调用。
实现站点间交互、需要获取他人的鉴权返回信息实现同步登录等场景。
最简单是直接使用ajax进行跨域请求,并获取返回进行处理。
鉴权中心同意开放跨域访问,后来通过评审我们一致认为这种方式有很大的安全隐患。
稍微懂点技术的Hacker使用一个开源的BurpSuite就能篡改请求&返回进行伪造登陆。

HttpClient

Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。
实现了所有 HTTP 的方法GET,POST,PUT,HEAD等。

  • 支持自动转向
  • 支持 HTTPS 协议
  • 支持代理服务器等

简而言之,HttpClient最大的作用是为了实现在服务端发送Http请求

POST发送请求

  1. public class MyTestServiceRequest extends HttpServlet
  2. {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  5. {
  6. this.doPost(req, resp);
  7. }
  8. @Override
  9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  10. {
  11. System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
  12. System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
  13. System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "stdout");
  14. String url = 请求地址;
  15. String xmlString = 需要发送的XML格式信息;
  16. HttpClient client = new HttpClient();
  17. PostMethod myPost = new PostMethod(url);
  18. //超时时间
  19. client.getParams().setSoTimeout(300*1000);
  20. String responseString = null;
  21. try{
  22. //设置请求头
  23. myPost.setRequestEntity(new StringRequestEntity(xmlString,"text/xml","utf-8"));
  24. //执行发送
  25. int statusCode = client.executeMethod(myPost);
  26. //如果返回码200,成功
  27. if(statusCode == HttpStatus.SC_OK)
  28. {
  29. BufferedInputStream bis = new BufferedInputStream(myPost.getResponseBodyAsStream()); //读取rsp的body体
  30. byte[] bytes = new byte[1024];
  31. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  32. int count = 0;
  33. while((count = bis.read(bytes))!= -1)
  34. {
  35. bos.write(bytes, 0, count);
  36. }
  37. byte[] strByte = bos.toByteArray();
  38. responseString = new String(strByte,0,strByte.length,"utf-8"); //转成String
  39. Map<String,String> authMap = new HashMap<String,String>();
  40. if(null!=responseString&&!"".equals(responseString))
  41. {
  42. //String转XML
  43. authMap = xmlElements(responseString);
  44. //鉴权成功
  45. if("true".equals(authMap.get("result")))
  46. {
  47. //远程鉴权成功的后续操作
  48. }else{
  49. //远程鉴权失败的后续操作
  50. }
  51. }
  52. bos.close();
  53. bis.close();
  54. }
  55. }catch (Exception e) {
  56. //异常处理
  57. }
  58. myPost.releaseConnection();
  59. client.getHttpConnectionManager().closeIdleConnections(0);
  60. }
  61. /**
  62. * 解析返回的XMLBody体
  63. */
  64. public Map<String,String> xmlElements(String xmlDoc) {…略…}
  65. @Override
  66. protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  67. {
  68. this.doPost(req, resp);
  69. }
  70. }

POST接收实例

这个实例意义不大,JAVA服务端接受POST请求直接用常规Servlet即可。

  1. public class MyTestServiceResponse extends HttpServlet
  2. {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
  5. {
  6. this.doPost(req, resp);
  7. }
  8. @Override
  9. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  10. {
  11. try
  12. {
  13. InputStream is = request.getInputStream(); //获取HTTP请求的输入流
  14. BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8")); //以HTTP请求输入流建立一个BufferedReader对象
  15. String buffer = null; //读取HTTP请求内容
  16. StringBuffer sb = new StringBuffer();
  17. while ((buffer = br.readLine()) != null)
  18. {
  19. sb.append(buffer+"n"); //读取所有的信息,并追加 转行
  20. }
  21. PrintWriter out = response.getWriter();
  22. StringBuffer stringBuffer = new StringBuffer("<?xml version="1.0" encoding="UTF-8"?>");//建议返回体
  23. stringBuffer.append("返回信息");
  24. ……
  25. stringBuffer.append("返回信息");
  26. out.write(stringBuffer.toString());
  27. out.flush();
  28. out.close();
  29. } catch (Exception e) {
  30. //异常处理
  31. }
  32. }
  33. }

结语

本质上来讲采用HttpClient实现服务端处理http请求的意义不是很大,现在SpringMVC和struts相当易用

相关文章