WebService之Axis2引擎的使用教程

一.Axis的简介

1.特性:

Apache Axis2 是Axis(Apache Extensible Interaction System 即阿帕奇可扩展交互系统)的后续版本,是新一代的SOAP引擎。采用名为 AXIOM(AXIs Object Model)的新核心XML(标准通用标记语言的子集)处理模型,利用新的XML解析器提供的灵活性按需构造对象模型。支持HTTP,SMTP,JMS,TCP传输协议。支持REST (Representational State Transfer)。

2.功能
  • 发送、接收、处理SOAP消息
  • 通过java创建web service(可以通过Eclipse开发)
  • 通过WSDL为server和client生成实现类
  • 简单地获得服务的WSDL
  • 在发送或接收的SOAP消息中上传附件

二.下载和配置

1.下载地址:
版本地址
官网下载点击进入
1.75版(最新版)点击下载
1.62版(常用版)点击下载
2.配置

1.新建一个java Web项目,将下载的Axis2-1.6.2.zip包解压

2.将解压后的文件中,提取有用部分文件拷贝到项目中:
- 将解压得到的Webapp文件中axis2-web文件夹拷贝到项目的Webcontent目录下
- 将Webapp下的WEB-INF下的web.xml拷贝到项目的WebContent\WEB-INF下
- 将Axis2-1.6.2\repository\modules文件夹拷贝到项目的WebContent\WEB-INF下
- 将Axis2-1.6.2\lib中的jar包(包括endorsed文件夹,但不拷贝所有txt文件),拷贝到WebContent\WEB-INF\lib文件夹中
- 将Axis2-1.6.2\conf下的axis2.xml拷贝到项目的WebContent\WEB-INF下
- 最后复制一份模板:将Axis2-1.6.2\samples\version\src\sample\axisversion\META-INF文件夹,拷贝到项目的WebContent\WEB-INF\services\UserInfoService(手动新建文件夹,此名字可以自定义)中。

三.Webservice服务端应用的实现:

说明:服务端的功能即将项目ORM层获取到的数据,通过WebService服务发布。例如,通过MyBatis获取到数据库里的数据,提供一个Service接口来获取数据。通过Axis2将数据组装成OMElement对象,在通过Service.xml发布到tomcat服务器上。外界可以通过URL直接访问,获取数据。这是一种常见的webservice应用方式,下面我们来实现:

1.编写一个简单的JavaBean,模拟对数据库中一张表的映射,用来展示JavaBean转为XML对象的过程:
package com.webservice.bean;
/*
 * 模拟:数据库表对应的JavaBean对象
 */
public class UserInfo {
    private String name;
    private String age;

    public UserInfo(String name, String age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
2.编写获取数据库数据的服务接口类:
package com.webservice.service;

import java.util.ArrayList;
import java.util.List;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.databinding.utils.BeanUtil;

import com.webservice.bean.UserInfo;

public class UserInfoService {
    /**
     * 获取用户信息服务
     * (做个示例,假设此服务取到数据库中的数据)
     * @return String xml
     * @throws Exception
     */
    public OMElement getUserInfoData() {
        // 模拟取数据库值
        List<Object> list = createListData();
        // 对象转OMElement(根节点为:root,二级节点:indexDet)
        OMElement omElement = BeanUtil.getOMElement(new QName("root"), list.toArray(), new QName("indexDet"),
            false, null);
        return omElement;
    }

    /*
     * 生成假数据,模拟从数据库中取出了两组数据
     */
    private List<Object>createListData(){
        List<Object> userInfo = new ArrayList<Object>();
        UserInfo user1 = new UserInfo("张三","23");
        UserInfo user2 = new UserInfo("李四","66");
        userInfo.add(user1);
        userInfo.add(user2);
        return userInfo;
    }

}
3.编写服务发布Service.xml配置文件,用来配置我们上面的服务接口:
<!-- 指定服务名,区分大小写,必须与Java服务类名相同 -->
<service name="UserInfoService">
    <Description>
        Get JSON data
    </Description>
     <!-- 指定服务所在的包名 -->
    <parameter name="ServiceClass" locked="false">
        com.webservice.service.UserInfoService
    </parameter>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </messageReceivers>
    <operation name="getUserInfoData">
        <!-- 指定URL访问别名 -->
        <actionMapping>urn:getUserInfoData</actionMapping>
    </operation>
</service>
4.发布和测试接口

在Tomcat中部署运行此项目,然后在浏览器中输入WSDL访问地址:http://localhost:8080/你的项目名/services/UserInfoService/getUserInfoData
打开后结果如下,则说明发布成功:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<ns:getUserInfoDataResponse xmlns:ns="http://service.webservice.com">
    <ns:return>
        <root>
            <indexDet>
                <age>23</age>
                <name>张三</name>
            </indexDet>
            <indexDet>
                <age>66</age>
                <name>李四</name>
            </indexDet>
        </root>
    </ns:return>
</ns:getUserInfoDataResponse>

若没有成功,请检查service.xml中的服务名和你项目中的服务名方法名是否对应,注意大小写敏感。

也可以输入:http://localhost:8080/你的项目名/services/UserInfoService?wsdl 若出现如下信息,则说明配置成功:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://service.webservice.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://service.webservice.com">
<wsdl:documentation>Get JSON data</wsdl:documentation>
    <wsdl:types>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.webservice.com">
            <xs:element name="getUserInfoData">
                <xs:complexType>
                    <xs:sequence/>
                </xs:complexType>
            </xs:element>
            <xs:element name="getUserInfoDataResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:anyType"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    部分内容省略……

四.客户端应用的实现:

说明:WebService的第二种应用方式,客户端将本地数据通过WebService传递给他人的服务器,供他人使用我们的数据。

1.新建一个服务端,步骤同上,用来接收客户端的数据并解密(最好不要明文传递数据,附带讲解下加密),代码如下:
package com.today.ems.receive;

import org.apache.axiom.om.impl.llom.OMTextImpl;
import org.apache.log4j.Logger;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import com.today.ems.common.util.CommonUtil;
import com.today.ems.common.util.DesUtil;

/**
 * 测试接收客户端数据服务
 * 
 * @author today 2017/3/3
 * @version 1.0
 */
public class ReceiveTest {
    private static Logger logger = Logger.getLogger(ReceiveTest.class);

    /**
     * 接收数据服务(接收多个参数)
     * 
     * @param xml
     * @param aimWsMess
     * @return
     */
    public String receiveXmlDataService(Object xml, Object aimWsMess) {

        String[] args = new String[] { "rltFlag", "rltMsg" };
        Object[] values = new Object[] { "0", "调用接口失败" };
        logger.info("————————————————接收数据开始————————————————");
        try {
            DesUtil desUtil = new DesUtil("34#@23ASDFVgh&*^%#cbmGADSfLKJLJKdfalsdkj");
            // 取出接收到的XML数据并解密
            String xmlStr = new String(Base64.decode(((OMTextImpl) (xml)).getText()));
            logger.info("加密XML信息为:" + ((OMTextImpl) xml).getText());
            logger.info("解密XML信息为:" + xmlStr);
            // 取出接收到报文头的数据
            String aimWsMessStr = ((OMTextImpl) (aimWsMess)).getText();
            // 通过invokeBlocking()方法传递byte[]参数时,会被Base64加密,所以要解密一次
            byte[] aimWsMessByte = Base64.decode(aimWsMessStr);
            // 对数据Des解密
            String aimStr = new String(desUtil.decrypt(aimWsMessByte));
            logger.info("解密后报文头信息为:" + aimStr);
            logger.info("————————————————接收完成————————————————");
            if (aimStr.length() != 0 && xmlStr.length()!=0) {
                values = new Object[] { "1", "调用接口成功" };
                return CommonUtil.makeXML(args, values);
            }
        } catch (Exception e) {
            logger.info(CommonUtil.getExceptionStackTrace(e));
            e.printStackTrace();
        }
        return CommonUtil.makeXML(args, values);
    }



}
2.服务端的Service.xml
    <service name="receiveDataService">
        <Description>
            Get Xml data
        </Description>

        <parameter name="ServiceClass" locked="false">
            com.today.ems.receive.ReceiveTest
        </parameter>

        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </messageReceivers>

        <operation name="receiveXmlData">
            <actionMapping>urn:receiveXmlData</actionMapping>
        </operation>
    </service>
3.客户端发送数据实现类:
package com.service.client;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.Properties;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.soap.SOAPHeaderBlock;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.log4j.Logger;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import com.today.ems.common.util.CommonUtil;
import com.today.ems.common.util.DesUtil;
import com.todayt.ems.util.ExUtil;

public class WebServiceImpl {

    private static Logger logger = Logger.getLogger(WebServiceImpl.class);
    private String ENCRYPT_KEY = "34#@23ASDFVgh&*^%#cbmGADSfLKJLJKdfalsdkj";

    /**
     * @description 调用psm平台的webservice接口
     * 
     * @param sendXmlData
     *            数据库取出的信息
     * @return 返回xml格式信息字符串
     */
    public String sendWs(String sendXmlData) {
        /**
         * 变量定义
         */
        String returnStrXml = "";// 返回信息
        String[] aimWsMess = new String[7];//本地配置文件信息
            aimWsMess[0] = "http://receive.ems.today.com";//服务器端的namespace命名空间,在WSDL中可以看到。
            aimWsMess[1] = "http://localhost:8080/axis2/services/receiveDataService";//服务器端的接收数据接口URL地址
            aimWsMess[2] = "receiveDataService";//服务类名:receiveDataService
            aimWsMess[3] = "commonWsService";// 这个是自定义的参数
            aimWsMess[4] = "com.today.ems.receive.ReceiveTest";//服务器端的包名和类名
            aimWsMess[5] = "receiveXmlData";//服务器端调用的方法名
            aimWsMess[6] = "";// 这个是自定义的参数
        // 获取总部webservice地址
        String wsUrl = aimWsMess[1];

         /**
         * wsUrl地址获取失败则直接返回
         */
        if (wsUrl == "") {
            if (logger.isInfoEnabled())
                logger.debug("获取webservice地址失败!");
            String[] args = new String[] { "errorCode", "errorMessage" };
            Object[] values = new Object[] { "01", "获取webservice地址失败!" };
            return CommonUtil.makeXML(args, values);
        }

        if (logger.isInfoEnabled())
            logger.debug("获取总部webservice地址:" + wsUrl);

        /**
         * 记录请求日志
         */
        if (logger.isInfoEnabled()) {
            logger.debug("id为:" + "的用户发起了webservice请求");
            logger.debug("请求服务串:" + sendXmlData);
        }

        /**
         * 利用base64对请求字符串进行编码
         */
        sendXmlData = Base64.encode(sendXmlData.getBytes());
        /**
         * 连接通道测试
         */
        if (1 != ping(wsUrl)) {
            String[] args = new String[] { "errorCode", "errorMessage" };
            Object[] values = new Object[] { "01", "服务端连接失败" };
            return CommonUtil.makeXML(args, values);
        }
        try {

            /**
             * 调用axisUtil的发送方法
             */
            returnStrXml = accessCollWS(aimWsMess, new Object[] { sendXmlData,
                encrypt(aimWsMess, ENCRYPT_KEY) });
        } catch (Exception e) {
            if (logger.isInfoEnabled())
                logger.debug("服务端调用失败:", e);
            return returnStrXml;
        } finally {
        }
        return returnStrXml;
    }

    /**
     * 两级平台webservice接口调用(基于RPCServiceClien进行调用)
     * 
     * @param aimWsMess
     *            : 被调用webservice的相关信息 aimWsMess[0] 被调用webservice的目标命名空间
     *            aimWsMess[1] 被调用webservice的url aimWsMess[2] 被调用webservice的方法
     * @param opAddEntryArgs
     *            参数
     * @return xml形式的字符串 <data> <errorCode>code</errorCode>
     *         <errorMessage>message</errorMessage> </data> 编码错误信息对照表:
     *         01:服务端连接失败! 02:服务端权限验证未通过! 03:服务端内部错误! 04:请求发送失败! 05:服务端未知错误!
     *         06:客户端未知错误! 07:被调用方法返回null或""! 08:业务处理信息! 09:客户端ip未绑定!
     *         99:业务校验失败信息!
     * 
     */
    @SuppressWarnings("unused")
    public String accessCollWS(String[] aimWsMess, Object[] opAddEntryArgs) throws Exception {
        try {
            // ModuleDelegatingClassLoader for
            // [me_opinformationpublish_1.0.0.qualifier
            javax.xml.stream.XMLOutputFactory xof = null;
            xof = new com.ctc.wstx.stax.WstxOutputFactory();
            Class.forName("javax.xml.stream.XMLOutputFactory");
            Class.forName("com.ctc.wstx.stax.WstxOutputFactory");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        try {
            // RPCServiceClient是RPC方式调用
            RPCServiceClient client = new RPCServiceClient();

            setSoapHeader(client, aimWsMess);
            Options options = client.getOptions();

            // 设置调用WebService的URL
            EndpointReference epf = new EndpointReference(aimWsMess[1]);
            options.setTo(epf);

            // 设置超时时间
            int timeout = 60000;
            options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(timeout));
            options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, new Integer(timeout));

            // 指定WSDL文件的命名空间和要调用的方法
            // 参数一:该服务wsdl中的:targetNamespace="http://service.webservice.com"
            // 参数二:该服务中的一个方法名:monitorDailyFreezService
            QName qname = new QName(aimWsMess[0], aimWsMess[2]);
            Object[] result = null;
            Thread thread = Thread.currentThread();
            ClassLoader loader = thread.getContextClassLoader();
            thread.setContextClassLoader(this.getClass().getClassLoader());
            try {
                if (logger.isDebugEnabled()) {
                    logger.debug("开始向服务端发送请求...");
                }
                // invokeBlocking方法有三个参数,第一个参数的类型是QName对象,指定WSDL文件的命名空间和要调用的方法;
                // 第二个参数表示要调用的WebService方法的参数值,没有不能传null,而要使用new Object[]{}
                // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。

                result = client.invokeBlocking(qname, opAddEntryArgs, new Class[] { OMElement.class });
                if (logger.isDebugEnabled()) {
                    logger.debug("服务端返回信息:" + result[0]);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                thread.setContextClassLoader(loader);
                client.cleanupTransport();// 关闭连接
            }
            return String.valueOf(result[0]);

        } catch (Exception e) {
            e.printStackTrace();
            if (logger.isInfoEnabled())
                logger.debug("调用下行WebService服务失败:" + ExUtil.getExceptionStackTrace(e));
            String[] args = new String[] { "errorCode", "errorMessage" };
            Object[] values = new Object[] { "04", "请求发送出错:" + ExUtil.getExceptionStackTrace(e) };
            return CommonUtil.makeXML(args, values);
        }
    }

    /*
     * 取beanId、clazz、methodName、userId的合成串进行加密
     * 
     * @return 返回加密后的字符串
     */
    private static byte[] encrypt(String[] aimWsMess, String encryptKey) {
        try {
            // 获取被加密串(截取部分数组)
            String encryptStr = aimWsMess[3] + aimWsMess[4] + aimWsMess[5] + aimWsMess[6];
            // 从配置文件获取密钥字符串
            DesUtil du = new DesUtil(encryptKey);
            byte[] encryptStrByte = encryptStr.getBytes("gbk");
            // 加密
            byte[] ek = du.encrypt(encryptStrByte);
            return ek;
        } catch (Exception e) {
            if (logger.isInfoEnabled())
                logger.debug("验证请求串加密失败:" + e.getStackTrace());
            return null;
        }
    }

    /**
     * 
     * 测试Web服务是否正常
     * 
     * @return 成功/失败标志 (1表示成功,0表示失败)
     */
    public int ping(String wsUrl) {
        if (logger.isDebugEnabled()) {
            logger.debug("开始测试连接通道...");
        }
        // < 100 is undertermined.
        // 1nn is informal (shouldn't happen on a GET/HEAD)
        // 2nn is success
        // 3nn is redirect
        // 4nn is client error
        // 5nn is server error
        try {
            // String wsUrl = PropertyRead.getString("WS_URL");
            String urlstr = wsUrl + "?wsdl";
            if (logger.isInfoEnabled())
                logger.debug("测试通道wsUrl地址:" + wsUrl);
            HttpURLConnection connection = (HttpURLConnection) new URL(urlstr).openConnection();
            // connection.setRequestMethod("HEAD"); // ? ResponseCode() == 501
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            // String msg = connection.getResponseMessage();
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                connection.disconnect();
                if (logger.isDebugEnabled()) {
                    logger.debug("成功连接到服务端!");
                }
                return 1;
            }
        } catch (MalformedURLException ex) {
        } catch (ProtocolException ex) {
        } catch (IOException ex) {
        }
        if (logger.isDebugEnabled()) {
            logger.debug("无法连通服务端!");
        }
        return 0;
    }

    /**
     * 设置soap的header信息,主要在header中追加用户名和密码,以作身份认证
     * 
     * @param client
     *            Soap客户端对象
     * 
     */
    public void setSoapHeader(RPCServiceClient client, String[] aimWsMess) throws Exception {
        try {
            // RPCServiceClient是RPC方式调用
            SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
            OMFactory omfactory = OMAbstractFactory.getOMFactory();
            OMNamespace omnames = omfactory.createOMNamespace("http://ws.apache.org/axis2", "hns");
            SOAPHeaderBlock soapHeader;
            soapHeader = factory.createSOAPHeaderBlock("field", omnames);
            // 加入header
            OMElement beanIdElement = factory.createOMElement("beanId", null);
            beanIdElement.addChild(factory.createOMText(beanIdElement, aimWsMess[3]));

            OMElement clazzElement = factory.createOMElement("clazz", null);
            clazzElement.addChild(factory.createOMText(clazzElement, aimWsMess[4]));

            OMElement methodNameElement = factory.createOMElement("methodName", null);
            methodNameElement.addChild(factory.createOMText(methodNameElement, aimWsMess[5]));

            OMElement userIdElement = factory.createOMElement("userId", null);
            userIdElement.addChild(factory.createOMText(userIdElement, aimWsMess[6]));// 用户Id

            soapHeader.addChild(beanIdElement);
            soapHeader.addChild(clazzElement);
            soapHeader.addChild(methodNameElement);
            soapHeader.addChild(userIdElement);
            client.addHeader(soapHeader);

        } catch (Exception ex) {
            if (logger.isInfoEnabled())
                logger.debug("Soap Header 信息设置出错:" + ExUtil.getExceptionStackTrace(ex));
            throw new Exception(ExUtil.getExceptionStackTrace(ex));
        }
    }

}
4.客户端类:运行测试即可。
package com.service.client;

import org.apache.axiom.om.OMElement;

import com.webservice.service.UserInfoService;

public class WebServiceClient {

    public String sendData() {
        String resultXml = "";
        //调用服务,取到模拟数据库中的数据
        UserInfoService service = new UserInfoService();
        OMElement omElement = service.getUserInfoData();
        //通过Webservice发送数据
        WebServiceImpl wsImpl = new WebServiceImpl();
        resultXml = wsImpl.sendWs(omElement.toString());
        //返回Xml格式的返回信息
        return resultXml;
    }

    //单元测试:测试发送数据
    public static void main(String[] args) {
        WebServiceClient client = new WebServiceClient();
        String resultStr = client.sendData();
        System.out.println(resultStr);
    }

}
5.用到的加密类:
package com.today.ems.common.util;

import java.security.Key;
import java.security.Security;

import javax.crypto.Cipher;

public class DesUtil {

    /** 字符串默认键值 */
    private static String strDefaultKey = "34#@23ASDFVgh&*^%#cbmGADSfLKJLJKdfalsdkj";

    /** 加密工具 */
    private Cipher encryptCipher = null;

    /** 解密工具 */
    private Cipher decryptCipher = null;

    /**
     * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
     * hexStr2ByteArr(String strIn) 互为可逆的转换过程
     * 
     * @param arrB
     *            需要转换的byte数组
     * @return 转换后的字符串
     * @throws Exception
     *             本方法不处理任何异常,所有异常全部抛出
     */
    public static String byteArr2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for (int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把负数转换为正数
            while (intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的数需要在前面补0
            if (intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    /**
     * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
     * 互为可逆的转换过程
     * 
     * @param strIn
     *            需要转换的字符串
     * @return 转换后的byte数组
     * @throws Exception
     *             本方法不处理任何异常,所有异常全部抛出
     * @author <a href="mailto:leo841001@163.com">LiGuoQing</a>
     */
    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;

        // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
        byte[] arrOut = new byte[iLen / 2];
        for (int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    /**
     * 默认构造方法,使用默认密钥
     * 
     * @throws Exception
     */
    public DesUtil() throws Exception {
        this(strDefaultKey);
    }

    /**
     * 指定密钥构造方法
     * 
     * @param strKey
     *            指定的密钥
     * @throws Exception
     */
    public DesUtil(String strKey) throws Exception {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Key key = getKey(strKey.getBytes());

        encryptCipher = Cipher.getInstance("DES");
        encryptCipher.init(Cipher.ENCRYPT_MODE, key);

        decryptCipher = Cipher.getInstance("DES");
        decryptCipher.init(Cipher.DECRYPT_MODE, key);
    }

    /**
     * 加密字节数组
     * 
     * @param arrB
     *            需加密的字节数组
     * @return 加密后的字节数组
     * @throws Exception
     */
    public byte[] encrypt(byte[] arrB) throws Exception {
        return encryptCipher.doFinal(arrB);
    }

    /**
     * 加密字符串
     * 
     * @param strIn
     *            需加密的字符串
     * @return 加密后的字符串
     * @throws Exception
     */
    public String encrypt(String strIn) throws Exception {
        return byteArr2HexStr(encrypt(strIn.getBytes()));
    }

    /**
     * 解密字节数组
     * 
     * @param arrB
     *            需解密的字节数组
     * @return 解密后的字节数组
     * @throws Exception
     */
    public byte[] decrypt(byte[] arrB) throws Exception {
        return decryptCipher.doFinal(arrB);
    }

    /**
     * 解密字符串
     * 
     * @param strIn
     *            需解密的字符串
     * @return 解密后的字符串
     * @throws Exception
     */
    public String decrypt(String strIn) throws Exception {
        return new String(decrypt(hexStr2ByteArr(strIn)));
    }

    /**
     * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
     * 
     * @param arrBTmp
     *            构成该字符串的字节数组
     * @return 生成的密钥
     * @throws java.lang.Exception
     */
    private Key getKey(byte[] arrBTmp) throws Exception {
        // 创建一个空的8位字节数组(默认值为0)
        byte[] arrB = new byte[8];

        // 将原始字节数组转换为8位
        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }

        // 生成密钥
        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

        return key;
    }

    public static void main(String[] args) {
        try {
            String test = "x:\\file1\\test.swf";
            DesUtil des = new DesUtil("SGCC201304241548");// 自定义密钥
            System.out.println("加密前的字符:" + test);
            System.out.println("加密后的字符:" + des.encrypt(test));
            System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
6.用到的工具类
package com.today.ems.common.util;

public class CommonUtil {

    /**
     * 生成指定参数的XML字符串
     * 
     * @param args
     *            参数
     * @param values
     *            参数值
     * @return 返回组装好的XML字符串
     */
    public static String makeXML(String[] args, Object[] values) {
        StringBuilder sb = new StringBuilder();
        // sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
        // sb.append("<DBSET>");
        sb.append("<data>");
        for (int i = 0; i < args.length; i++) {
            sb.append("<");
            sb.append(args[i]);
            sb.append(">");
            sb.append(values[i]);
            sb.append("</");
            sb.append(args[i]);
            sb.append(">");
        }
        sb.append("</data>");
        // sb.append("</DBSET>");
//      System.out.println("makeXML()" + "生成指定参数的XML字符串:" + sb.toString());
        return sb.toString();
    }

    /**
     * 获取异常信息堆栈字符串
     * 
     */
    public static String getExceptionStackTrace(Exception e) {
        String stackTrace = "";
        StackTraceElement[] ste = e.getStackTrace();
        for (int i = 0; i < ste.length; i++) {
            stackTrace += "\n" + ste[i] + "\n";
        }
        return stackTrace;
    }

}
7.异常处理类:
/**
 * Filename is com.today.common.TException.java
 * Copyright (C) 2013 TodayEnergy. All Rights Reserved.
 */
package com.today.ems.common;

/**
 * <strong>TException</strong> Class.
 * 
 * @author today
 * @version 1.0 2013/12/13
 */
public class TException extends Exception {

    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    /**
     * constructor
     */
    public TException() {
        super();
    }

    /**
     * constructor
     * @param message Message
     */
    public TException(String message) {
        super(message);
    }

    /**
     * constructor
     * @param cause Throwable
     */
    public TException(Throwable cause) {
        super(cause);
    }

    /**
     * constructor
     * @param message Message
     * @param cause Throwable
     */
    public TException(String message, Throwable cause) {
        super(message, cause);
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值