接口不被允许发送数据,SERVLET转发方案

项目向其他系统发送数据失败,发现乙方正式环境对指定项目进行了限制,禁止直接向其他系统发送数据,限制还不能被改变(很是无奈),但能在本机向本系统内其他服务发送数据,考察到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>

这么无聊也是没谁了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值