JAVA调用外接设备(制卡机)(二)-------------JQuery跨域解决方案

本文介绍了在JAVA项目中调用制卡机遇到的跨域问题及其解决方案。原本本地调用制卡机成功,但在WebSphere服务器上因DLL加载失败导致制卡失败。为解决此问题,采取了服务器端调用客户端代码的方法,通过AJAX远程调用服务执行本地Tomcat中的制卡功能,实现了跨域访问。最终采用了JSONP作为跨域解决方案。

近日,在做项目的时候,有用到JAVA调用制卡机的一个功能。在之前的博客中,有提到过,参照api文档和相关的SDK,已经成功的在本地代码中调用到了制卡机,实现制卡的打印功能。but,后来测试才发现,原来本地代码调用成功了,但是相关的加载制卡机的USB驱动都是在本地代码中执行的,而不是在浏览器端执行的。额,知道这意味着什么吗?一个字描述,“ 坑 ”,真是坑死人不偿命呀。

当时我以为功能开发完了,就直接把代码SVN提交了上去,但是在部署到正式服务器的时候,却怎么也调不了,一直提示“ 制卡失败 ”。当时以后失败的原因是dll 文件加载失败,因为正式服务器上的中间件是WebSphere,而本地的中间件是Tomcat,Tomcat加载制卡机的DLL文件的时候,只需要将其放置在bin目录下就可以了,但是WebSphere之前没用过,我尝试着将dll文件放到了WebSphere下的所有bin目录文件夹下,但是还是不成功。后来公司同事提醒说,加载制卡机的代码都在Action后台执行的,会不会制卡机必须放在服务器端才可以调用成功。当时听到这,第一感觉就是TMD的坑了,当然也怪自己之前光顾着实现功能去了,没有全局思考考虑,这也是我的失误。

有了这个思路,就开始考虑,怎么在本地调用制卡功能,起初想了很多办法,比如什么把Action的代码给放到JSP中,打开JSP执行,后来发现JSP其实也是在后台变成Servlet中执行的,所以这个方案失败。后来又想过更改官方的JAR包代码,但是后来测试还是不行。尝试了很多办法,最后的话,想出了一个简单粗暴的方案,那就是服务器端调用客户端的代码。也就是说把制卡的代码打包到Tomcat中,然后Tomcat放到本地,需要用制卡的功能的时候,点击系统的制卡菜单,系统会用AJAX或者WebService远程调用相关的服务,执行代码,最后调用本地的Tomcat启动制卡机。当然了,这个方法总感觉比较LOW,但是没办法呀,时间有限,工作中还有其他的任务,加之客户也催的很紧,情急之下,只能先应急了。

标题JAVA调用外接设备(制卡机)(二)-------------JQuery跨域解决方案

在这个过程中,之前已经把JAVA调用制卡的功能都写好了,现在只需要在系统的相关JSP页面中,当用户访问这个JSP页面的时候,获取其真实的IP地址,然后根据其IP地址,访问其提供的制卡服务地址就OK了。在这里的话,就涉及到AJAX远程跨域访问的问题,最终找到的跨域解决方案是使用JSONP的方案:(这个githup上的一个开源项目,如要使用,先下载 https://github.com/webmodules/jsonp

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ page import="com.wonders.yksx.salvation.model.*"%>
<%@ page import="com.wonders.yksx.common.model.*"%>
<%@ page import="com.wonders.yksx.common.util.*"%>
<%@ page isELIgnored="false"%>
<%@ page import="java.io.IOException"%>
<%@ page import="java.io.PrintWriter"%>
<%@ page import="java.net.Inet4Address"%>
<%@ page import="java.net.InetAddress"%>
<%@ page import="java.net.NetworkInterface"%>
<%@ page import="java.util.Enumeration"%>
<%@ page import="javax.servlet.ServletException"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%@ page import="javax.servlet.http.HttpServletResponse"%>

<jsp:useBean id="pageStyle" class="java.lang.String" scope="session" />
<%
			ListOfDicModel listOfHospitalModel = (ListOfDicModel) session
			.getAttribute("listOfHospitalModel");
	ListOfOtherInfoModel listOfOtherInfoModel = (ListOfOtherInfoModel) request
			.getAttribute("listOfOtherInfoModel");
%>

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=GBK">
		<link href="css/<%=pageStyle%>" rel="stylesheet" type="text/css">
		<script src="http://apps.bdimg.com/libs/jquery/1.7.2/jquery.min.js"></script>
		<script type="text/javascript">
/**
 *打印采用8*6inch的纸张设置(203.2*152.4mm)
 */

	var PRINT_UNIT = "mm";
	var PRINT_WINDOW_WIDTH = 203.2;
	var PRINT_WINDOW_HEIGHT = 152.4;
	var PRINT_WORD_TOP = 82.9;
	var PRINT_WORD_HEIGHT = 4.5;
	var PRINT_WORD_INTERVAL = 5;
	var PRINT_WORD_LEFT = 65.2;
	var PRINT_OFFSET = 1;
	  
	  var IPAddress;
	  //获取IP地址	
	  getIPAddr();	
	  	
      function getNewWindowContent(i)
      {

       	var str = "<html>";
      	str += "<head><title>医疗帮困就医记录册封面打印</title></head>";
      	str += "<body font-size='"+PRINT_WORD_HEIGHT+PRINT_UNIT+"' style='filter:flipv()fliph();'>";
      	str += "<div id='box' background-color=blue style='width:"+PRINT_WINDOW_WIDTH+PRINT_UNIT+";height:"+PRINT_WINDOW_HEIGHT+PRINT_UNIT+"'></div>";
      	//str += "<form action=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值