在日常的開發項目中,有時候會遇到這種情況:自己公司開發的系統要接入協力廠商系統時,有時候會因為每個公司的底層的jdk版本不一樣,而導致發送過去的報文,到協力廠商時無法解析。

 

項目實例:

 

在做金融系統軟件時,我們常會遇到,加密解密,而加密解密這一整套機制往往是而協力廠商公司提供的,在我所做的項目中:因為協力廠商公司的加密解密程式是基於sun jdk版本,而公司自己的框架是基於IBM jkd版本的,所以導致加密出來的報文發送到協力廠商公司解密不了,為此,單獨寫一個以sun jdk版本的系統進行一個轉接,將公司前臺頁面加密後的報文通過scocke發送到這個系統,然後由此系統進行java 加密演算法加密,將加密報文發送給協力廠商公司,協力廠商公司接受報文進行解密,發送加密報文到這系統,這系統將報文解密成功後,將返回結果直接發送到公司自己的框架系統,終於實現一整套完整的加密解密驗證。

 

相關代碼如下:

 

寫一個servlet程式,當項目啟動時,直接調用這servlet

 

public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
System.out.println("------");
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
doPost(request,response);
}
public void init() throws ServletException {
Hvericfca hiver = new Hvericfca();
hiver.run();
}

 

寫個多線程

 

public class Hvericfca extends Thread {
public void run() {
ServerSocket srv = null;
try {
srv = new ServerSocket();
SocketAddress sa = new InetSocketAddress(7777);
srv.bind(sa);
while (true) {
Socket socket = srv.accept();
try {
new ServeOneJabber(socket);
} catch (IOException e) {
socket.close();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
srv.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

 

class ServeOneJabber extends Thread {
private Socket socket;
private InputStream in;;
private OutputStream out;


 

public ServeOneJabber(Socket s) throws IOException {
socket = s;
in = socket.getInputStream();
out = socket.getOutputStream();
start();
}
public void run() {
try {
@SuppressWarnings("unused")
int rc = 0, recvlen;
byte[] recvbuf = new byte[65537];
byte[] headbuf = new byte[9];
rc = recv(headbuf, 8);
String slen = new String(headbuf).replaceFirst("^0*", "");
recvlen = Integer.parseInt(slen.trim());
rc = recv(recvbuf, recvlen);
String sendmsg = new String(recvbuf, 0, recvlen);
this.process(sendmsg);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
}
}
}


 

private synchronized void process(String str) throws IOException {
System.out.println("reply is -- " + str);
KpsVeriy veriy = new KpsVeriy();
String srcdata = this.readStringXml(str, "SRC_DATA");
String signdata = this.readStringXml(str, "SIGN_DATA");
String result = veriy.Veriy(srcdata, signdata);
StringBuffer sbf = new StringBuffer();
StringBuffer sbfxml = new StringBuffer();
sbf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sbf.append("<ROOT>");
sbf.append("<TRSP_CD>");
sbf.append("000000");
sbf.append("</TRSP_CD>");
sbf.append("<RSP_CD>");
sbf.append("KPS00000");
sbf.append("</RSP_CD>");
sbf.append("<RESULT>");
sbf.append(result);
sbf.append("</RESULT>");
sbf.append("</ROOT>");
int xmllen = sbf.toString().length();
int len = String.valueOf(xmllen).length();
int i = 8 - len;
String headxml = "";
for (int a = 0; a < i; a++) {
headxml = headxml + "0";
}
headxml = headxml + xmllen;
sbfxml.append(headxml);
sbfxml.append(sbf);
byte[] sendbuf = sbfxml.toString().getBytes();
out.write(sendbuf);
}
 
// 解析xml報文
private String readStringXml(String xml, String domname) {
StringReader read = new StringReader(xml);
InputSource source = new InputSource(read);
SAXBuilder sb = new SAXBuilder();
try {
Document doc = sb.build(source);
Element root = doc.getRootElement();
Element dom = root.getChild(domname);
return dom.getValue();
} catch (JDOMException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

 

//定長的報文解析
int recv(byte[] recvbuffer, int len) {
int LeftByte;
try {
LeftByte = len;
while (LeftByte > 0) {
int rc = in.read(recvbuffer, len - LeftByte, LeftByte);
LeftByte -= rc;
}
} catch (IOException e) {
return -1;
}
return len;
}

 

調用協力廠商公司的加密解密API中的方法

 

public String Veriy(String srcdata,String signdata){
int rc = 0;
System.out.println("環境初始化");

 

/*加密解密的API方法這裏就不提供了*/
if (rc != 0) {
log.info("企業簽名驗證測試失敗:" + kpsSign.getErrDesc());
System.out.println("企業簽名驗證測試失敗:" + kpsSign.getErrDesc());
return "NO";
} else {
log.info("企業簽名驗證測試成功");
System.out.println("企業簽名驗證測試成功");
return "OK";
}
}

 

以上一整套就是利用java socket 解決系統轉接問題,這一整套也可以用於當雙方所支援的報文格式不一樣時,利用此系統稍做修改就可以了!這裏只是一個解決方案,具體代碼可以根據項目要求實現!
 
From:CSDN
 
 
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()