cxf+spring+数字签名开发webservice(二)

时间:2023-03-08 22:53:58
cxf+spring+数字签名开发webservice(二)
  • 场景

        上一章中的webservice接口,因为现场正式环境的项目与外部单位网络不通,是通过前置机与外部进行数据交换,所以我们将webservice部署在前置机,在使用HttpURLConnection与正式服务器上进行数       据传递。这里可以使用的技术挺多的,如:java的rmi,Hessian,spring的HttpInvoker等,下面是使用HttpURLConnection的代码(实际情况是最后选择了spring的HttpInvoker):

  • HttpURLConnection客户端调用方法 
 package http.rpc.util;

 import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map; public class ClientUtils {
/*
* @param url 服务端url地址
* @param beanid 访问远程方法所在的类名
* @param method 调用服务端的方法名
* @param param 服务端的方法的参数
*/
public static Object remoteService(String url, String beanid, String method, String param) {
HttpURLConnection urlcon = null;
String result = null;
try {
if (param == null) {
param = "";
}
URL u = new URL(url + "/webservice.rpc"); byte[] databuffer = new byte[1024];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int len = 0;
try {
urlcon = (HttpURLConnection) u.openConnection();
urlcon.setDoOutput(true);
urlcon.setRequestMethod("POST");
OutputStream buf = new BufferedOutputStream(urlcon.getOutputStream());
OutputStreamWriter out = new OutputStreamWriter(buf, "UTF-8");
/* 向webservice.rpc传递3个参数 */
out.write("serverid=" + beanid + "&method=" + method + param);
out.flush();
out.close(); urlcon.connect();
if (urlcon.getResponseCode() == 200) {
InputStream in = urlcon.getInputStream();
while ((len = in.read(databuffer)) != -1) {
outStream.write(databuffer, 0, len);
}
in.close();
result = new String(outStream.toByteArray(), "utf-8");
System.out.println(result);
urlcon.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
urlcon.disconnect();
return result;
}
}
  • 服务端web.xml配置(简单的servlet配置)
 <servlet-mapping>
<servlet-name>testserver</servlet-name>
<url-pattern>/webservice.rpc</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>testserver</servlet-name>
<servlet-class>http.rpc.Server</servlet-class>
  • 服务端http请求类
 package http.rpc;

 import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Server extends HttpServlet{ @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost");
String serverid = req.getParameter("serverid").toString();
String method = req.getParameter("method").toString();
String methodParam = req.getParameter("param").toString();
ServletOutputStream sos = resp.getOutputStream();
String result = "远程调用返回";
sos.write(result.getBytes("utf-8"));
}
}
  • 最后说说

Server类得到远程方法信息后,可以使用反射去调用具体方法。返回的数据如果是对象类型,可以实现序列化和反序列化进行数据传递。因为使用spring的HttpInvoker,就没写得很完善,这里只是做个记录,有时间再完善吧。