项目向其他系统发送数据失败,发现乙方正式环境对指定项目进行了限制,禁止直接向其他系统发送数据,限制还不能被改变(很是无奈),但能在本机向本系统内其他服务发送数据,考察到Tomcat部署的项目是可对外开放的,于是决定在tomcat部署一个JAVAWBE项目做接口转发。
婴儿级教程做个接口转发。
注意勾选,或者自己写一个web.xml也可。
写一个接口继承HttpServlet,然后将数据转JSON发送到本接口读取后处理转发给外系统。
对response的内容进行编辑示例:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 这里是token解析错误,可能是token过时导致,或者token错误
StatusResponse statusResponse = new StatusResponse();
statusResponse.setStatus(ResponseStatus.TOKEN_CHECK_ERROR);
statusResponse.setMessage("您的钥匙token已经过期或不合格");
statusResponse.setData(false);
response.setStatus(ResponseStatus.OK);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
PrintWriter writer = response.getWriter();
writer.write(JSONObject.toJSONString(statusResponse));
writer.close();
return false;
}
代码json封装案例:
String resp= null;
JSONObject obj = new JSONObject();
obj.put("name", "张三");
obj.put("age", "18");
String query = obj.toString();
log.info("发送到URL的报文为:");
log.info(query);
try {
URL url = new URL("http://10.10.10.110:8888"); //url地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type","application/json");
connection.connect();
try (OutputStream os = connection.getOutputStream()) {
os.write(query.getBytes("UTF-8"));
}
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String lines;
StringBuffer sbf = new StringBuffer();
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), "utf-8");
sbf.append(lines);
}
log.info("返回来的报文:"+sbf.toString());
resp = sbf.toString();
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}finally{
JSONObject json = (JSONObject)JSON.parse(resp);
}
最终本代码需要处理的结果:
class里面的内容:
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收请求发来的参数、
BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
StringBuffer responseStrBuilder = new StringBuffer();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr);
JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
String param= jsonObject.toJSONString();
Map pushMap= (Map) JSON.parse(param);
String requentUrl=null, assemableRequestXML=null , usercode=null, password=null;
for(Object mapEntry : pushMap.entrySet()) {
//这里对数据处理
}
try {
String resp = pushService(requentUrl, assemableRequestXML, usercode, password);
//这里处理返回的结果给发送方
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
PrintWriter writer = response.getWriter();
writer.write(JSONObject.toJSONString(resp));
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String pushService(String requentUrl, String sendMessage,
String username, String password) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
PrintWriter printWriter = null;
try {
// 第一步:创建服务地址
URL url = new URL(requentUrl);
//忽略ssl证书
if(url.getProtocol().equals("https"))
SslUtils.ignoreSsl();
// 第二步:打开一个通向服务地址的连接
HttpsURLConnection connection = (HttpsURLConnection) url
.openConnection();
// 第三步:设置参数
// 3.1发送方式设置:POST必须大写
connection.setRequestMethod("POST");
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
// 3.2设置数据格式:content-type
connection.setRequestProperty("Content-Type",
"text/xml;charset=UTF-8");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Accept", "*/*");
//去掉转码后的换行
String encodeBase64String = Base64.encodeBase64String((username+":"+password).getBytes()).replaceAll("\r|\n", "");
// 添加账号密码认证
connection.setRequestProperty("Authorization", "Basic "+encodeBase64String);
// 3.3设置输入输出,因为默认新创建的connection没有读写权限,
connection.setDoInput(true);
connection.setDoOutput(true);
// 将信息以流的方式发送出去
// 获取URLConnection对象对应的输出流
OutputStream outputStream = connection.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
//加多一层PrintWriter,可以让返回值不乱码
printWriter = new PrintWriter(outputStreamWriter);
// 发送请求参数即数据
printWriter.print(sendMessage);
// flush输出流的缓冲
printWriter.flush();
// 第五步:接收服务端响应
// 获取当前连接请求返回的数据流
InputStream is = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(is,"UTF-8");
br = new BufferedReader(inputStreamReader);
String temp = null;
while (null != (temp = br.readLine())) {
sb.append(temp);
}
//关闭流
outputStream.close();
outputStreamWriter.close();
is.close();
inputStreamReader.close();
//断开连接,disconnect是在底层TCP socket链接空闲时才切断,如果正在被其他线程使用就不切断。
connection.disconnect();
} catch (Exception e) {
sb.append("===========Exception========"+e.getMessage());
} finally {
try {
if (printWriter != null) {
printWriter.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
sb.append(e.getMessage());
}
}
return sb.toString();
}
由于是访问https,内容会被加密,需要处理ssl,否则可能获取错误反馈:
public class SslUtils {
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
//uap工具测试的话就用下面这个 ufjdk是jdk1.6的
// SSLContext sc = SSLContext.getInstance("SSL");
//服务器上是jdk1.8的,需要TLSv1.2 否则会报Received fatal alert: protocol_version
//update:2022-03-07
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
/**
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
*/
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}
web.xml文件需要修改访问路径:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>servelet</display-name><!-- 项目名称 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>servelet.PushServiceUtils</servlet-class> <!-- 访问类的java下路径位置 -->
</servlet>
<servlet-mapping> <!-- /servelet/ReSend SecoundServlet-->
<servlet-name>first</servlet-name>
<url-pattern>/ReSend</url-pattern>
<!-- 接口后路径配置 比如127.0.0.1:8080/servelet/ReSend -->
</servlet-mapping>
</web-app>
这么无聊也是没谁了。