https+xml服务端/客户端java后台编写及soapUI https测试

 

一、https+xml服务端编写

1.1 创建证书文件

1.1.1 创建服务器KeyStore

[plain]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -alias server_jks_cennavi -keyalg RSA -keypass 123456 -storepass 123456 -keystore server.jks -validity 3650  

1.1.2 导出服务端证书

[plain]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. keytool -export -trustcacerts -alias server_jks_cennavi  -file server.cer -keystore  server.jks -storepass 123456  

1.1.3 创建客户端KeyStore

[plain]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. keytool -genkey -alias client_p12_cennavi -keyalg RSA -keypass 123456 -storepass 123456 -keystore client.p12 -validity 3650 -storetype PKCS12  

1.1.4 导出客户端Cer证书

[html]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. keytool -export -trustcacerts -alias client_p12_cennavi  -file client.cer -keystore  client.p12 -storepass 123456 -storetype PKCS12  

1.1.5 交换证书

交换导入服务端和客户端证书,作为双方信任证书。
[plain]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. keytool -import -trustcacerts -alias client_p12_cennavi -file client.cer -keystore server.jks  
  2. keytool -import -trustcacerts -alias server_jks_cennavi -file server.cer -keystore client.jks  

1.2 tomcat https配置

[plain]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
  2.                maxThreads="150" scheme="https" secure="true"  
  3.                clientAuth="true" sslProtocol="TLS" keystoreFile="C:\Users\hsinghsu\server.jks" keystorePass="123456"  
  4.                truststoreFile="C:\Users\hsinghsu\server.jks" truststorePass="123456"/>  
注:以上配置为https双向验证,若只要https服务端的单向验证,则将clientAuth="true" 和truststoreFile="C:\Users\hsinghsu\server.jks" truststorePass="123456" 配置去掉即可。

1.3 服务端java代码编写

1.3.1 编写servlet服务端代码

编写servlet代码,用于获取用户https+xml/http+xml请求,解析请求后进行相应业务为逻辑处理返回相应信息给请求方。
[java]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.hsinghsu.test.web.servlet;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.util.HashMap;  
  7. import java.util.Iterator;  
  8. import java.util.Map;  
  9. import java.util.zip.GZIPOutputStream;  
  10.   
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletRequest;  
  13. import javax.servlet.ServletResponse;  
  14. import javax.servlet.http.HttpServlet;  
  15. import javax.servlet.http.HttpServletRequest;  
  16. import javax.servlet.http.HttpServletResponse;  
  17.   
  18. import org.dom4j.Attribute;  
  19. import org.dom4j.Document;  
  20. import org.dom4j.Element;  
  21. import org.dom4j.io.SAXReader;  
  22.   
  23. public class TestInterfaceServlet extends HttpServlet  
  24. {  
  25.       
  26.     /** 
  27.      * 对外接口主入口 
  28.      * 用于获取用户请求,返回用户请求使用。 
  29.      */  
  30.     public void service(ServletRequest request, ServletResponse response)  
  31.         throws ServletException, IOException  
  32.     {  
  33.         HttpServletResponse httpResponse = (HttpServletResponse)response;  
  34.         HttpServletRequest httprequest = (HttpServletRequest)request;  
  35.         httpResponse.setContentType("text/html;charset=UTF-8");  
  36.           
  37.         Map<String, String> mapHeader = getHeaderMap(httprequest);// 获取http头信息  
  38.           
  39.         String requestXml = "";//请求过来的xml报文  
  40.         String responseXml = "";//返回的xml报文  
  41.         Document doc = null;  
  42.           
  43.         InputStream is = request.getInputStream();  
  44.         System.out.println("======http header timestamp is :" + mapHeader.get("timestamp"));  
  45.           
  46.         SAXReader saxReader = new SAXReader();  
  47.         Map<String, String> map = new HashMap<String, String>();  
  48.           
  49.         try  
  50.         {  
  51.             doc = saxReader.read(is);  
  52.             requestXml = doc.asXML();  
  53.             System.out.println("======request xml :" + requestXml);  
  54.             Element rootElm = doc.getRootElement();//从root根节点获取请求报文  
  55.             map = parseXML(rootElm, new HashMap<String, String>());  
  56.               
  57.             String msgname = map.get("msgname");//从http body中获取到的msgname值  
  58.               
  59.             // 是否https访问  
  60.             if (request.isSecure())  
  61.             {  
  62.                 //https访问  
  63.                 if ("loginReq".equals(msgname))  
  64.                 {  
  65.                     System.out.println("the https+xml request is loginReq");  
  66.                     responseXml =  
  67.                         "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ecity><msgname>loginRep</msgname><msgversion>1.0.0</msgversion><result><rspcode>0</rspcode><rspdesc>成功</rspdesc></result><svccont><uid>111</uid></svccont></ecity>";  
  68.                 }  
  69.                 else  
  70.                 {  
  71.                     System.out.println("请求接口名称不在本系统内");  
  72.                     responseXml =  
  73.                         "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ecity><msgversion>1.0.0</msgversion><result><rspcode>1</rspcode><rspdesc>请求接口名称不在本系统内</rspdesc></result></ecity>";  
  74.                 }  
  75.             }  
  76.             else  
  77.             {  
  78.                 //http访问    
  79.                 if ("logOutReq".equals(msgname))  
  80.                 {  
  81.                     System.out.println("the http+xml request is logOut");  
  82.                     responseXml =  
  83.                         "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ecity><msgname>logOutRep</msgname><msgversion>1.0.0</msgversion><result><rspcode>0</rspcode><rspdesc>成功</rspdesc></result><svccont><uid>111</uid></svccont></ecity>";  
  84.                 }  
  85.                 else  
  86.                 {  
  87.                     System.out.println("请求接口名称不在本系统内");  
  88.                     responseXml =  
  89.                         "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ecity><msgversion>1.0.0</msgversion><result><rspcode>1</rspcode><rspdesc>请求接口名称不在本系统内</rspdesc></result></ecity>";  
  90.                 }  
  91.             }  
  92.               
  93.         }  
  94.         catch (Exception e1)  
  95.         {  
  96.             System.out.println("请求数据不正确");  
  97.             responseXml =  
  98.                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ecity><msgversion>1.0.0</msgversion><result><rspcode>2</rspcode><rspdesc>请求数据不正确</rspdesc></result></ecity>";  
  99.               
  100.         }  
  101.           
  102.         // 对报文进行压缩处理  
  103.         String AcceptEncoding = "gzip";  
  104.         if (mapHeader != null)  
  105.             AcceptEncoding = mapHeader.get("Accept-Encoding");  
  106.         if (null != AcceptEncoding && "gzip".equals(AcceptEncoding))  
  107.         {  
  108.             // 使用gzip压缩报文  
  109.             System.out.println("======output response xml with gzip is : " + responseXml);  
  110.             response.getOutputStream().write(gZip(responseXml.getBytes()));  
  111.             response.getOutputStream().flush();  
  112.             response.getOutputStream().close();  
  113.         }  
  114.         else  
  115.         {  
  116.             // 不压缩报文,直接传输  
  117.             System.out.println("======output response xml without gzip is : " + responseXml);  
  118.             response.getOutputStream().write(responseXml.getBytes());  
  119.             response.getOutputStream().flush();  
  120.             response.getOutputStream().close();  
  121.         }  
  122.           
  123.     }  
  124.       
  125.     /** 
  126.      * 获取http头信息  
  127.      * <功能详细描述> 
  128.      * @param request 
  129.      * @return 
  130.      * @see [类、类#方法、类#成员] 
  131.      */  
  132.     public Map<String, String> getHeaderMap(HttpServletRequest request)  
  133.     {  
  134.         Map<String, String> map = new HashMap<String, String>();  
  135.         if (null != request.getHeader("msgname") && !"".equals(request.getHeader("msgname")))  
  136.             map.put("msgname", request.getHeader("msgname"));  
  137.         if (null != request.getHeader("Accept-Encoding") && !"".equals(request.getHeader("Accept-Encoding")))  
  138.             map.put("Accept-Encoding", request.getHeader("Accept-Encoding"));  
  139.         if (null != request.getHeader("timestamp") && !"".equals("timestamp"))  
  140.             map.put("timestamp", request.getHeader("timestamp"));  
  141.         return map;  
  142.     }  
  143.       
  144.     /** 
  145.      * 将xml解析成map键值对 
  146.      * <功能详细描述> 
  147.      * @param ele 需要解析的xml对象 
  148.      * @param map 入参为空,用于内部迭代循环使用 
  149.      * @return 
  150.      * @see [类、类#方法、类#成员] 
  151.      */  
  152.     private Map<String, String> parseXML(Element ele, Map<String, String> map)  
  153.     {  
  154.         for (Iterator<?> i = ele.elementIterator(); i.hasNext();)  
  155.         {  
  156.             Element node = (Element)i.next();  
  157.             System.out.println("======parseXML node name:" + node.getName());  
  158.             if (node.attributes() != null && node.attributes().size() > 0)  
  159.             {  
  160.                 for (Iterator<?> j = node.attributeIterator(); j.hasNext();)  
  161.                 {  
  162.                     Attribute item = (Attribute)j.next();  
  163.                     System.out.println("======parseXML property name:" + item.getName() + " property value:"  
  164.                         + item.getValue() + "\n");  
  165.                     map.put(item.getName(), item.getValue());  
  166.                 }  
  167.             }  
  168.             if (node.getText().length() > 0)  
  169.             {  
  170.                 System.out.println("======parseXML node value:" + node.getText());  
  171.                 map.put(node.getName(), node.getText());  
  172.             }  
  173.             if (node.elementIterator().hasNext())  
  174.             {  
  175.                 parseXML(node, map);  
  176.             }  
  177.         }  
  178.         return map;  
  179.     }  
  180.       
  181.     /** 
  182.      * gZip压缩方法 
  183.      * 将原报文通过gzip压缩 
  184.      * @param data 
  185.      * @return 
  186.      * @see [类、类#方法、类#成员] 
  187.      */  
  188.     public static byte[] gZip(byte[] data)  
  189.     {  
  190.         byte[] b = null;  
  191.         try  
  192.         {  
  193.             ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  194.             GZIPOutputStream gzip = new GZIPOutputStream(bos);  
  195.             gzip.write(data);  
  196.             gzip.finish();  
  197.             gzip.close();  
  198.             b = bos.toByteArray();  
  199.             bos.close();  
  200.         }  
  201.         catch (Exception ex)  
  202.         {  
  203.             ex.printStackTrace();  
  204.         }  
  205.         return b;  
  206.     }  
  207.       
  208. }  

1.3.2 web.xml配置

在web.xml中配置访问该接口的servlet,详见配置如下:
[html]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>interfaceServlet</servlet-name>  
  3.     <servlet-class>com.hsinghsu.test.web.servlet.TestInterfaceServlet</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>interfaceServlet</servlet-name>  
  7.     <url-pattern>/interface</url-pattern>  
  8. </servlet-mapping>  
注:如果在servlet中需要注入service/dao的bean,请参见:http://www.it165.net/pro/html/201307/6589.html 【如何用Spring将Service注入到Servlet中(注解模式)】

1.3.3 启动服务端

启动服务端tomcat。服务端的访问地址为:https://127.0.0.1:8843/testhttps/interface

二、https+xml客户端编写

2.1 编写客户端java代码,示例如下:

[java]   view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.hsinghsu.test.web.servlet;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;  
  13. import org.apache.commons.httpclient.HttpClient;  
  14. import org.apache.commons.httpclient.HttpStatus;  
  15. import org.apache.commons.httpclient.methods.PostMethod;  
  16. import org.apache.commons.httpclient.methods.StringRequestEntity;  
  17. import org.apache.commons.httpclient.params.HttpMethodParams;  
  18. import org.dom4j.Document;  
  19. import org.dom4j.io.SAXReader;  
  20.   
  21. public class TestReqServlet extends HttpServlet  
  22. {  
  23.       
  24.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  25.         throws ServletException, IOException  
  26.     {  
  27. //        String sURL = "http://127.0.0.1:8080/testhttps/interface";  
  28.         String sURL = "https://127.0.0.1:8443/testhttps/interface";  
  29.         String xml =  
  30.             "<?xml version='1.0' encoding='UTF-8'?><ecity><msgname>loginReq</msgname><timestamp>20140422094111</timestamp><svccont><token>112255</token></svccont></ecity>";  
  31.         toHTTPS(sURL, xml);  
  32.     }  
  33.       
  34.       
  35.     /** 
  36.      * https调用 
  37.      * <功能详细描述> 
  38.      * @param sURL 请求URL 
  39.      * @param xml 请求报文 
  40.      * @return 
  41.      * @throws IOException 
  42.      * @see [类、类#方法、类#成员] 
  43.      */  
  44.     public String toHTTPS(String sURL, String xml)  
  45.         throws IOException  
  46.     {  
  47.         sURL = "https://127.0.0.1:8443/testhttps/interface";  
  48.           
  49.         System.setProperty("javax.net.ssl.trustStore""C:\\Users\\hsinghsu\\Desktop\\https\\client.jks");  
  50.         System.setProperty("javax.net.ssl.trustStorePassword""123456");  
  51.         System.setProperty("javax.net.ssl.keyStoreType""PKCS12");  
  52.         System.setProperty("javax.net.ssl.keyStore""C:\\Users\\hsinghsu\\Desktop\\https\\client.p12");  
  53.         System.setProperty("javax.net.ssl.keyStorePassword""123456");  
  54.         //注:去掉以上5行则表示使用http协议访问  
  55.           
  56.         String resultXML = "";  
  57.         HttpClient httpClient = null;  
  58.         PostMethod postMethod = null;  
  59.         try  
  60.         {  
  61.             httpClient = new HttpClient();  
  62.             // 设置超时时间  
  63.             httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000);  
  64.             httpClient.getHttpConnectionManager().getParams().setSoTimeout(30000);  
  65.             postMethod = new PostMethod(sURL);  
  66.             postMethod.setRequestEntity(new StringRequestEntity(xml, "text/html""UTF-8"));  
  67.               
  68.             postMethod.setRequestHeader("Content-Type""text/xml;charset=UTF-8");  
  69.             postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());  
  70.             int statusCode = httpClient.executeMethod(postMethod);  
  71.             if (statusCode != HttpStatus.SC_OK)  
  72.             {  
  73.                 System.out.println("Call method failed: " + postMethod.getStatusLine());  
  74.             }  
  75.             BufferedReader in = null;  
  76.             try  
  77.             {  
  78.                 in = new BufferedReader(new InputStreamReader(postMethod.getResponseBodyAsStream(), "utf-8"));  
  79.                 SAXReader saxReader = new SAXReader();  
  80.                 Document doc = saxReader.read(new InputStreamReader(postMethod.getResponseBodyAsStream(), "utf-8"));  
  81.                 resultXML = doc.asXML();  
  82.             }  
  83.             catch (IOException e)  
  84.             {  
  85.                 e.printStackTrace();  
  86.             }  
  87.             finally  
  88.             {  
  89.                 if (in != null)  
  90.                 {  
  91.                     try  
  92.                     {  
  93.                         in.close();  
  94.                     }  
  95.                     catch (IOException e)  
  96.                     {  
  97.                         e.printStackTrace();  
  98.                     }  
  99.                 }  
  100.             }  
  101.               
  102.         }  
  103.         catch (Exception e)  
  104.         {  
  105.             e.printStackTrace();  
  106.         }  
  107.         finally  
  108.         {  
  109.             if (postMethod != null)  
  110.             {  
  111.                 postMethod.releaseConnection();  
  112.             }  
  113.         }  
  114.         return resultXML;  
  115.     }  
  116.       
  117. }  
配置完成后使用servlet访问即可测试

三、soapUI测试https+xml接口

打开soapUI,File-->Preferences-->SSL Settings,导入client.p12,输入密码即可
注:以上配置为https双向验证,若只要https服务端的单向验证,则去掉client.p12 SOAPUI配置证书即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值