近日在做web呼叫的时候碰到JS跨域问题,需与华为的服务器交互,用户提交客户号和验证码后,到华为的服务器上去验证用户信息,然后返回用户信息给我们的网页,直接用ajax访问在IE上有安全提示问题,用户信息可返回,调低安全级别可实现,但作为门户网站,让客户去适应我们的要求,这种方法是不可行的,参考了网上一篇“服务器端可控情形JS跨域访问解决方法”,这位老大写了个大概,对我这种低手来说仍然是有点不清不楚的,经过一天痛苦的摸索之后,用动态脚本的方式实现了跨域的解决,现把代码记录下来,以便今后查看。
我启了两个服务,分别是tomcat和weblogic。用tomcat的工程模拟本地,weblogic的工程模拟远程。
先在本地的页面中这样做
java 代码
- function transTest(){
- var username = document.form1.username.value;
- var email = escape(document.form1.email.value);
- var url = "http://10.13.78.95:7001/finprog/registerCheckUserByAjax.do?username="+username+"&email="+email;
- url = encodeURI(url);
-
- var js_obj = document.createElement( "script" );
- js_obj.type = "text/javascript";
- js_obj.setAttribute( "src" , url);
- document.body.appendChild(js_obj);
- }
-
- function onServerResponse(responseText){
- alert(responseText);
- var message = document.getElementById("message");
- if(message.hasChildNodes()){
- message.removeChild(message.childNodes[0]);
- }
- var messagenode=document.createTextNode(responseText);
- message.appendChild(messagenode);
-
- }
上面jsp页面中,执行transTest()方法后,document.createElement( "script" ); 会动态的在页面中生成一段script脚本,然后在脚本中,绕过IE的安全验证,js_obj.setArrribute() 将信息作为 src 的 url 参数提交给了远程servlet,(用的.do请求,名字是finprog工程里的一个servlet,我懒,不想新写)。
在registerCheckUserByAjax.do中的最末,我返回给建立通信的jsp页面以信息,代码如下:
java 代码
- UserInfoDTO userinfoDTO = (UserInfoDTO) serviceModel.get("userinfoDTO");
- String responseText;
- if(userinfoDTO==null){
- responseText="成功";
- }else if (userinfoDTO.getUserName().equals(username) && userinfoDTO.getEmail().equals(email)) {
- responseText="失败";
- } else {
- responseText="成功";
- }
- responseText = new String(responseText.getBytes(), "ISO-8859-1");
- response.getWriter().println("var a='" + responseText + "';");
- response.getWriter().println("onServerResponse(a); ");
这里去调JSP页面中的onServerResponse()方法,回显信息给本地。 这样本地网页就会响应服务器结果,通过message节点把服务器端信息给回显出来,如果是中文要先编好码。
上面的方法我在IE和FireFox中都测过,大功告成。
另外参考网上的解决方法,还可以用本地代理页面,涉及到配置Apache的问题,看得我头昏,我想到了一些解决方法,用一个本地的servlet,在JS提交的时候,提交到本地servlet,然后本地servlet去请求远程servlet,至于怎么建立通信传值,可以这样,在远程servlet中再请求本地的servlet,这时本地servlet对于远程来说,也变成服务器端了,本地再response回给JSP,这是个笨办法。不过没试过。另外,可以用socket方案,不过对于我们公司的层层防火墙是个考验,还有可以在本地存放一个临时页面,用HttpURLConnection con = (HttpURLConnection)url.openConnection();
与远程建立连接,不过也没试过。暂时没有精力去搞了。
分享到:
相关推荐
js跨域问题解决方案.
该文档介绍了vue和普通web页面中iframe实现跨域的解决方案,解决了主页面中无法调用iframe方法的问题
js跨域访问解决方案总结,不同域名下cookie相互操作
能够完美解决arcgis js跨域解决问题,该文档详细说明了.NET或者java环境下跨域解决
js跨域解决方案
JS跨域访问解决
JS跨域访问解决方案总结.。总结了记住JS跨域访问解决方案。
解决arcgis server跨域问题: 1、停掉ArcGIS Server的服务。 2、 打开<ArcGIS Server> \framework\runtime\tomcat\conf\web.xml,注册跨域bean 3、lib下拷贝 cors-filter-2.5.jar java-property-utils-1.9.1.jar包 4...
在浏览器查看一个pdf文件时常常不知道怎么显示,这个资源可以很好的帮到你,而且还附有跨域的解决办法。
JS跨域访问解决方案总结.pdf
解决js的跨域问题
通过这个插件,可以实现不同域名的双向通信问题,内含demo 配套文章:http://blog.csdn.net/mycwq/article/details/16344171
Javascript跨域访问解决方案 个人在网上搜集的资料,用于传输信息,不提倡下载
js解决跨域访问问题,在用js访问web后台方法的时候,有时候会遇到跨域访问的问题。文档中介绍了跨域访问产生的原因以及相应的解决办法及代码示例。
本篇文章主要介绍了解决ajax不能访问本地文件问题(利用js跨域原理),具有一定的参考价值,有兴趣的可以了解一下。
JS跨域访问解决方案总结[参照].pdf
通过HTTPClient界面在JSP中嵌入iframe子界面跨域时,无法获取跨域界面的属性值的问题
报表的下拉控件中用到一个名为creatPopup()的js方法,该方法本书是拒绝跨域访问的。 js跨域问题,是在一个域下的页面中通过js访问另一个不同域下的数据对象,出于安全性考虑,几乎所有浏览器都不允许这种跨域访问。 ...
最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot...我面临的第一个问题是跨域,浏览器控制台直接报CORS,以我多年开发经验,我果断在后台配置了跨域配置,代码如下: @Configuration publi