今天的工作中要访问摄像机内部的一个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. [zz]pg_hba.conf 一种安全地配置策略

    PostgreSQL默认只监听本地端口,用netstat -tuln只会看到“tcp 127.0.0.1:5432 LISTEN”.修改postgresql.conf中的listen_address= ...

  2. 暑假集训(4)第七弹——— 组合(hdu1850)

    题意概括:你赢得了第一局.魔鬼给出的第二局是,如果有N堆牌,先手的人有几种可能胜利. 问题分析:尼姆游戏,先得到n堆牌的数量异或和,再将异或和与每一个牌组的数量异或,如果结果小于原牌组数量 则可能++ ...

  3. COM原理

    1, 进程内组件:服务程序杯加载到客户的进程空间,通常是DLL的形式.本地组件:服务程序与与客户程序在同一台电脑上,通常是EXE.远程组件: 服务程序与与客户程序在不同的电脑上,可以是DLL模块也可是 ...

  4. vc++字符转换

    测试环境: vs2008 开发语言:C++ #include <iostream>#include <windows.h>#include <string> // ...

  5. SMB/CIFS协议解析一概述

    一.SMB/CIFS协议的区别 在NetBIOS出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统,这个系统基于NetBIOS设定了一套文件共享协 议,Microsoft ...

  6. 用C#对ADO.NET数据库完成简单操作

    数据库访问是程序中应用最普遍的部分.随着C#和ADO.NET的引入,这种操作变得更简单.这篇文章将示范四种最基础的数据库操作. ● 读取数据.其中包括多种数据类型:整型,字符串,日期型. ● 写数据. ...

  7. SSO单点登陆

    一句话,就是能让各个不同的域名带回相同的认证信息即可.实现方法,就是把其中一个登陆后,把认证的信息分别保存在不同域名下的 cookie,当在验证是否登陆时,验证 cookie,如果是子域名,这个则直接 ...

  8. 在Linux环境下给php添加mbstring扩展

    1,今天在开发项目的时候使用了一个php函数(mb_strcut),运行代码时候提示报错"call to undefind function mb_strcut",首先检查下函数名 ...

  9. Ecshop与Jquery冲突的完美解决方案

    ecshop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的.   但恰恰的,在封装JSON各种方法的同时对objec ...

  10. fedora 取消自动升级

    fedora启动时经常CPU使用很高,看下进程原来是yumBackend.这是个yum的自动更新进程 只要关闭自动更新就可以了 gsettings set org.gnome.settings-dae ...