今天的工作中要访问摄像机内部的一个web站点,这就涉及到jquery的ajax跨域访问的问题。我使用的是jquery1.7的版本,下面总结如下:

  • 问题一:
    一开始用IE调试,总是返回No Transport错误,这是因为在进行跨域访问的时候,IE8浏览器(不同的浏览器对跨域的支持不一样)不支持跨域访问,必须在ajax请求前面加上 jQuery.support.cors = true;才行。
  • 问题二:跨域问题解决后,返回的xhr.statusText = "[object Error]",并且xmlHttpReqest.readyState始终为0。
    后来我更改为自己的url,可以访问,说明是跨域的问题。后来我不用jquery的ajax,用最原始的ajax在执行到open函数的时候,提示没有权限。这才知道是跨域访问没有权限的问题。

  后来在项目组同事的帮助下找到了下面的解决方案:

  就是通过吧url和参数发送给servlet,然后servlet再建立HttpURLConnection,把请求发送给其他的站点。当然我们的项目为了把所有发送的请求都对应一个servlet,使用的是过滤器。

  first.jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link href="IEfile/doc/css/base.css" rel="stylesheet" type="text/css" />
<link href="IEfile/doc/css/login.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="IEfile/doc/script/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="IEfile/doc/script/jquery.cookie.js"></script>
<script type="text/javascript" src="IEfile/doc/script/login.js"></script>
<script type="text/javascript" src="IEfile/doc/script/common.js"></script>
<script type="text/javascript" src="IEfile/doc/script/Translator.js"></script> <script type="text/javascript">
var g_lxdLogin = null; // Login.xml
function DoLogin()
{
m_szUserPwdValue = "111";//Base64.encode("admin" + ":" + "12345");
var m_lHttp = "http://";
var m_szHostName = "localhost";
var m_lHttpPort = "8080";
var urlTest = m_lHttp + m_szHostName + ":" + m_lHttpPort + "/WebServerTest1/PSIA/Custom/SelfExt/userCheck";
alert(urlTest);
$.ajax({
type: "GET",
url: urlTest,
async: true,
timeout: 15000,
beforeSend: function(xhr) {
xhr.setRequestHeader("If-Modified-Since", "0");
xhr.setRequestHeader("Authorization", "Basic " + m_szUserPwdValue);
},
success: function(xmlDoc, textStatus, xhr)
{
alert("login success");
if("200" == xmlDoc.documentElement.getElementsByTagName('statusValue')[0].childNodes[0].nodeValue)
{
var szUrl = decodeURI(document.URL);
if(szUrl.indexOf("?page=") != -1)
{
var szPage = szUrl.substring(szUrl.indexOf("page=") + 5, szUrl.indexOf("&params="));
if(szPage.indexOf(".asp") == -1)
{
szPage = szPage.concat(".asp");
}
var szParam = szUrl.substring(szUrl.indexOf("&params=") + 8, szUrl.length);
$.cookie('page',szPage+"?"+szParam+"%1");
}
else
{
$.cookie('page',null);
} $.cookie('userInfo'+m_lHttpPort,m_szUserPwdValue==""?Base64.encode("anonymous:\177\177\177\177\177\177"):m_szUserPwdValue);
window.location.href = "main.asp";
}
else
{
if(!$('#UserName').prop("disabled")) {
$('#UserName').focus();
}
$('#UserName').val('');
$('#Password').val('');
alert(translator.translateNode(g_lxdLogin, 'LoginTips4'));
}
},
error: function(xhr, textStatus, errorThrown)
{
alert("login error = " + textStatus);
if("timeout" == textStatus)
{
alert(translator.translateNode(g_lxdLogin, 'ConnectTimeoutTips'));
}
else
{
alert(translator.translateNode(g_lxdLogin, 'NetworkErrorTips'));
}
}
});
}
</script>
</head> <body >
<input type="button" name="b" value="TestJson" onclick="DoLogin()"/>
</body> </html>

  web.xml:

    <!-- psia过滤器 -->
<filter>
<filter-name>psiaFilter</filter-name>
<filter-class>com.zm.servlet.psiaFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>psiaFilter</filter-name>
<url-pattern>/PSIA/*</url-pattern>
</filter-mapping> <!-- 起始页面-->
<welcome-file-list>
<welcome-file>/IEfile/doc/page/first.jsp</welcome-file>
</welcome-file-list>

  psiaFilter.java:  

package com.zm.servlet; 

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection; import javax.servlet.*;
import javax.servlet.http.*; public class psiaFilter implements javax.servlet.Filter { public void destroy() {
} public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)(request);
String uri = req.getRequestURI();
uri = uri.substring(15);
String Auth = req.getHeader("Authorization");
String method = req.getMethod();
HttpServletResponse res = (HttpServletResponse)(response); //((HttpServletResponse)(response)).sendError(700, "psiaFilter" + uri + Auth); String url= "http://172.16.8.178" + uri;
URL theURL = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection)theURL.openConnection(); urlConnection.setReadTimeout(11);
urlConnection.setRequestMethod(method);
urlConnection.setRequestProperty("If-Modified-Since", "0");
urlConnection.setRequestProperty("Authorization", Auth);
urlConnection.connect(); PrintWriter out = res.getWriter();
//out.println(url); InputStream in = urlConnection.getInputStream();
int c;
while((c = in.read()) != -1)
out.write(c);
System.out.println(out.toString());
//chain.doFilter(request, response);
} public void init(FilterConfig arg0) throws ServletException {
} }

ajax跨域访问的解决方案的更多相关文章

  1. ajax 跨域访问的解决方案

    ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...

  2. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  3. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  4. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  5. ajax跨域访问总结

    1,jsonp的使用 就是script引用别的站点js,利用回调把内容传给这个js。 a需要引入b,在页面上引入b的js,里面有b的函数,在a中执行,就能拿到json了。 程序B中test.js的代码 ...

  6. PHP Ajax 跨域问题最佳解决方案 【摘自菜鸟教程】

    PHP Ajax 跨域问题最佳解决方案 分类 编程技术 http://www.runoob.com/w3cnote/php-ajax-cross-border.html 本文通过设置Access-Co ...

  7. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

  8. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  9. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

随机推荐

  1. 抽象类[abstract]_C#

    抽象类(abstract) abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其它类的基类.标记为抽象或包含在抽象类中的成员必须通 ...

  2. 【转载】干货来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载七)LAMP集成安装

    学Linux做程序开发也好,做系统管理也好,做网络管理员也好,做系统运维也好,不会LAMP和LNMP,那就等于连皮毛都不会!本篇是文字版的LAMP集成安装,下次连载我们要介绍LNMP的文字版安装.有喜 ...

  3. UVALive 3645 Objective: Berlin(最大流 :时序模型)

    题意:已知n(n <= 150)个城市和m(m <= 5000)个航班,每个航班有出发地.到达地.乘坐人数.起飞时间和降落时间(时间用时和分表示),求从一个指定城市出发,去往另一个指定城市 ...

  4. linux同步

    1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...

  5. iOS进阶——App生命周期

    State Description Not running The app has not been launched or was running but was terminated by the ...

  6. SystemFile

    header('Content-Type:text/html; charset = utf-8'); 1. echo "<pre/>";echo __FILE__.&q ...

  7. HTML5 drag & drop 拖拽与拖放简介

    DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer. draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,例如 ...

  8. mysql高可用探究 MMM高可用mysql方案

    1    MMM高可用mysql方案 1.1  方案简介 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复 ...

  9. 对golang服务器开发模式的一些思考

    多线程+同步阻塞模型 在我们的游戏项目中使用的golang服务器开发方式如下 1.多线程逻辑 2.同步阻塞. 也就是说, 每个人一个线程(goroutine), io线程=逻辑线程 这种方式的优点: ...

  10. JavaScript 高级程序设计 02-变量、数据类型

    一.JavaScript变量 1.变量的定义 在定义变量时,统一使用关键字var,后跟变量名(即标识符,如果不知道什么是标识符,可以到这去查看),如下 var message; //定义一个变量 注意 ...