CORS(Cross-Origin Resource Sharing) 跨域资源共享

2013-01-29     
CORS

全称:Cross-Origin Resource Sharing

中文意思:跨域资源共享?

好吧,目前中文方面的资料还比较少,能搜索到的那仅有的几篇相关介绍,也几乎是雷同的。

最近工作上也有用到CORS的地方,随便做点分享吧,也当是笔记。

 

大家也知道,XMLHttpRequest接口是Ajax的根本,而Ajax考虑到安全性的问题,是禁止跨域访问资源的。

也就是说:www.a.com的页面无法通过Ajax来调用www.b.com的资源。

很多人又会说,但jQuery的$.ajax()明明就可以跨域访问啊!

对,的确是跨了,但那是jsonp!关于jsonp的介绍也很多了,这里不扯。

其实jQuery的$.ajax()方法中,也可以实现CORS,只要服务器端配合,跨域就不需要使用jsonp。

 

CORS是XMLHttpRequest Level 2中新增加的功能

支持情况如下

\

支持情况还算良好(假如无视IE的话)。

移动端的开发,除了Opera Mini还不支持,其他设备的版本支持情况也很好。

 

 

好了,下面进入实战,直接说说使用方法。

1 var xhr = new XMLHttpRequest();
2 xhr.open(“POST”, “http:// www.2cto.com “, true);
3 xhr.send();没有看错!就是这么简单!

和Ajax的调用方法是毫无差异的,需要的只是服务器端的配合。

 

服务器端如何配置?

PHP:只需要使用如下的代码设置即可。

1 <?php
2  header(“Access-Control-Allow-Origin:*”); 以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。

当然,这样有很大的危险性,恶意站点可能通过XSS攻击我们的服务器。

如果仅支持www.a.com这个站跨域访问,那就:

1 <?php
2  header(“Access-Control-Allow-Origin: http://www.a.com”); 这样就基本配置ok了~

 

前端的部分,如果需要跨域向服务器发cookies

还需要设置一个属性:withCredentials

1 var xhr = new XMLHttpRequest();
2 xhr.open(“POST”, “http://www.b.com”, true);
3 xhr.withCredentials = true; //支持跨域发送cookies
4 xhr.send(); 当然,服务器端也要设置

1 <?php
2 header(“Access-Control-Allow-Credentials: true”);

 

好吧,下面说说需要注意的地方。

如果不使用第三方库,用原生javascript来写,还是有些地方需要注意的。

 

1、不要设置X-Requested-With头

因为跨域访问,如需带header,服务器端必须要allow,不然报错。

setRequestHeader(“X-Requested-With”, “XMLHttpRequest”)主要用在Ajax调用资源时,服务器能判断该次请求是Ajax的。

 

2、INVALID_STATE_ERR: DOM Exception 11

这是一个神奇的错误,网上找了一下,也没什么较为明确的答复。但我却在手机端遇到了这个问题!

测试了一下:在IOS4和IOS5的UC浏览器、Safari、Chrome,进行CORS访问均会报这个错,

Android4.0原生浏览器,也无法正常CORS(没有测试2.3和2.2)

估计也是报这个错,但没控制台,所以无法查bug。

Android4.0下的Chrome和UC都可以顺利CORS。

本以为是浏览器兼容的问题,经过蛋疼的排查之后,发现…

我们可以看一下,下面两段代码有啥差异?

1 var xhr = new XMLHttpRequest();
2 xhr.withCredentials = true; //支持跨域发送cookies
3 xhr.open(“POST”, “http://weibo.com/demo/b/index.php”, true);
4 xhr.send();1 var xhr = new XMLHttpRequest();
2 xhr.open(“POST”, “http://weibo.com/demo/b/index.php”, true);
3 xhr.withCredentials = true; //支持跨域发送cookies
4 xhr.send();唯一的差异就是xhr.withCredentials = true; 的位置。

但就是这个差别,导致第一段代码无法顺利在手机端运行,并报INVALID_STATE_ERR: DOM Exception 11这个错!

而在桌面版浏览器下,两段代码都可以顺利运行!

所以,以后设置withCredentials属性时,一定要在open方法之后!

 

篇幅有限,想要参考更多的CORS,可以查看下面的参考网站.

 

参考:

http://www.w3.org/TR/cors/

http://www.html5rocks.com/en/tutorials/cors/

https://developer.mozilla.org/en-US/docs/HTTP_access_control  (MDN十分详细的讲解)

http://enable-cors.org/index.html (不同的服务器怎么配置CORS)

http://people.opera.com/tiffanyb/2011/cors/ (来自Opera的CORS测试Demo)

http://arunranga.com/examples/access-control/ (另一个CORS的测试Demo)

win10 preview下的浏览器ua

Spartan:

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0; rv:11.0) like Gecko

 

IE11 (win10):

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0

超权威超详尽的802.11ac模块更换攻略

【电脑报在线】在上周的文章中,我们为大家破解了802.11ac无线路由器的产品迷局,告诉了大家哪些802.11ac无线路由器价值不大,又有哪些产品值得购买。本周,我们将会手把手教大家更换笔记本的内置WiFi无线模块,方便大家领略802.11ac高速无线网络的魅力。

高速802.11ac无线模块有3款,首选英特尔AC 7260

先温习一下上周的知识,要享受到真正高速的802.11ac无线魅力,我们需要有高速的无线路由器和无线网卡。无线路由器的802.11ac无线带宽(5GHz下)至少要有867Mbps。对应的,802.11ac无线网卡端至少也得是867Mbps带宽的。

那么,笔记本的内置802.11ac无线模块,有哪些型号可以达到867Mbps无线带宽呢?

目前我们在淘宝上买得到的,主要有这样3款:

英特尔的AC 7260(常见),最大802.11ac带宽867Mbps,售价150元左右,双天线(左图);

博通的BCM94352(较多),最大802.11ac带宽867Mbps,售价180元左右,双天线(中图);

Atheros QCA9880(稀少),最大802.11ac带宽1.3Gbps,售价380元,三天线(右图)。

从价格来看,英特尔的AC7260是高性价比之选。事实上,目前很多笔记本,尤其是新款的商用本都采用了这一无线模块,事实证明相当稳定,所以笔者购买的也是它。

Atheros QCA9880虽号称可达1.3Gbps802.11ac无线带宽,但价格较高,而对应的1.3Gbps 802.11ac无线路由器也很贵,所以在这里我们不推荐。而不推荐的另一个原因,就是它采用的是三天线,但目前预埋了三根天线的机型不多。最后还有一个原因:TP-LINK的1.3Gbps 802.11ac无线路由器WDR7500就采用了Atheros的方案,笔者记得里面就有QCA9880芯片,但实际应用中并不稳定。

 

重要!更换前期四项注意

1.注意白名单问题

在这里必须提醒大家,并不是所有笔记本都可以随意更换内置的WiFi无线模块。大部分惠普、ThinkPad的笔记本就存在白名单问题,也就是BIOS支持列表的问题。淘宝卖家会明确告诉你:某某无线模块不能直接在惠普、ThinkPad机型上使用,需要刷白名单(这是相当麻烦的工作,我们仅建议高手尝试,这里不赘述)。另外,联想品牌的部分机型,如IdeaPad Y系列,也存在白名单问题,淘宝上销售的英特尔AC 7260无线模块也无法直接使用(开机就会报错)。相对的,华硕、宏碁、神舟、海尔等品牌的机型则不存在白名单问题。

2.注意新出现的NGFF接口

不存在白名单问题的机型,也不一定就能够随意更换无线网卡,这里还涉及接口匹配的问题。老笔记本内置的WiFi无线模块多为Mini PCI-E接口,淘宝上销售的WiFi无线模块也多是这个接口。但随着技术的发展,目前出现了NGFF接口(也就是大家俗称的M.2接口)的WiFi无线模块和采用这种模块的机型,这种机型内部根本就没有Mini PCI-E插槽,只能购买NGFF接口的802.11ac无线模块安装——好消息是,淘宝也有这类模块销售。

同为英特尔的AC 7260 802.11ac无线模块,左侧是NGFF接口的,右侧是Mini PCI-E接口的,尺寸差异一目了然

戴尔新款Latitude商用本上采用的就是NGFF接口的无线模块,事实上,该模块的接口宽度比NGFF插槽还要窄(规范不同,都属于NGFF范畴)

3.注意天线数量

在这里笔者还要强调两个前期工作:一定要仔细核查笔记本预埋的WiFi天线数量和天线的长短。这是笔者多年来为别人的笔记本更换无线模块积累的最重要的经验,也是很多玩家在更换无线模块前忽视了的问题。

预埋天线的数量可通过查询原配无线模块的标准天线数量来查询,但笔者强烈建议拆机查看。大家或许会奇怪:笔记本不是至少都内置了两根WiFi天线吗(还有的预留了三根天线,多见于商用机)?但这是以前的“老观点”了,现在有不少低端机型只有一根WiFi天线——它还真没偷工减料,因为部分150Mbps带宽的802.11n无线模块就只有一个天线接口!而我们要更换的802.11ac无线模块至少都是两根天线的!

采用单天线无线模块且只预埋了一根WiFi天线的笔记本目前越来越多了,值得玩家警惕(单天线导致的问题以前我们说过很多次,这里就不赘述了)

 

4.最容易忽视的问题:天线长短

天线长短!?对,这是最容易被人忽视的问题,但却是很“要命”的问题!比如笔记本原配的无线模块是全高尺寸(早期绝大部分WiFi无线模块都是全高的),WiFi天线从另一头伸过来,正好可以接上。但当你换成半高模块(半高模块的螺丝孔对位问题可通过购买“半高转全高卡托”来解决,这个东西很便宜,10元一片)后,天线很可能就无法到位了!笔者的就遇到过多次这样的问题,搞得痛苦不堪。

上为全高的5100AGN,下为半高的AC7260,右侧就是半高转全高的卡托——10元钱解决大问题

该笔记本内部虽有三根WiFi天线,但由于太短,换用半高无线模块后没有一根能够到位

 

最简单的动手操作:无线模块更换

如果以上问题都不是问题(或者都解决了),恭喜你——你可以实际开工了。

先购买AC 7260无线模块,然后把笔记本的后盖揭开,露出无线模块位,直接用新的AC 7260替换掉原配即可。还原后,启动电脑,安装最新版的英特尔无线网卡驱动。注意,AC 7260与部分老无线网卡的驱动并不通用,建议直接到downloadcenter.intel.com(英特尔官网下载中心)进行搜索下载。驱动安装完成后,你的802.11ac疾速梦就完成了一半了。剩下的一半工作就是购买与之配套的无线路由器并连接^__^。

这是更换AC 7260无线模块后的效果图(借助了半高转全高卡托)

设备管理器中出现了AC 7260无线网卡,网络状态中可看到连接带宽为866.7Mbps(即867Mbps)

本文出自2014-06-30出版的《电脑报》2014年第25期 E.硬件DIY
(网站编辑:soso)

JNI方法签名–JNI中C如何调用Java的类方法时用到

JNI方法签名

ref:http://www.cnblogs.com/shaweng/p/4013320.html

为什么会有方法签名这种东西呢?这是因为Java这边支持函数重载,即虽然参数不一样,但是方法名一样,那么在JNI层它们的方法名都会是一样的,那JNI也会犯迷糊了,得找哪个呢?

不过也正是因为其参数类型是不一样的,所以就出现了方法签名,利用方法签名和方法名来唯一确定一个JNI函数的调用。
既然方法签名是基于参数类型的不同而形成的,首先要知道Java各数据类型对应的签名是什么,也就是所谓的类型签名,
在jni.h文件中就已经定义了这样一套规则,如下:

1
2
3
4
5
6
7
8
9
10
11
typedef union jvalue {
    jboolean    z;
    jbyte       b;
    jchar       c;
    jshort      s;
    jint        i;
    jlong       j;
    jfloat      f;
    jdouble     d;
    jobject     l;
} jvalue;

对应于Java端的数据类型,我们也可以看一下下面的表:

Java 类型 类型签名
boolean Z
byte B
char C
short S
int I
long L
float F
double D
L全限定名;,比如String, 其签名为Ljava/lang/util/String;
数组 [类型签名, 比如 [B

对于上面的类,要注意其后面还有一个分号。
而对一个方法,其签名就是其参数类型签名和返回值类型签名的字符串,其形式如下:
(类型签名1类型签名2…)返回值类型签名
每个类型签名之间是没有空格的,下面看看两个例子:

有方法 1):

1
public string addTail(String tail, int index)

其对应的签名如下:

1
(Ljava/util/String;I)Ljava/util/String;

方法 2):

1
public int addValue(int index, String value,int[] arr)

其对应的签名如下:

1
(ILjava/util/String;[I)I

相信通过这两个例子,大家也能够了解了方法签名是什么样的形式了吧,对于JNI这些奇形怪状的表示形式也有一定的了解了。

Root CY-DZ1380和互联星空S1 之后的备份

比如启动沙发管家:
am start -n com.shafa.market/com.shafa.market.ShafaHomeAct
启动电视家:
am start -n com.elinkway.tvlive2/com.elinkway.tvlive2.activity.SplashActivity
启动浏览器:
am start -n com.android.browser/com.android.browser.BrowserActivity
启动沙发桌面:
am start -n com.noshufou.android.su/com.noshufou.android.su.HomeActivity
启动刷机精灵:
am start -n com.shuame.mobile/com.shuame.mobile.ui.SplashActivity
CY-DZ1380:
adb pull /system/app/galaxyitv-video_3.5.30_zhejiang_mobile_zjcmcc_cp.apk t
adb pull /system/app/GalaxyLauncher_Version_3.5.12_jshd.apk t
adb pull /system/app/CMCCProvider.apk t
adb pull /system/app/HomepageActivity1.5.0.1-zhejiang–20140819.apk t

互联星空S1:
adb pull /system/app/galaxyitv-video_3.5.32_zhejiang_mobile_zjcmcc_cp_voice.apk t
adb pull /system/app/GalaxyLauncher_zjcmcc_3.5.22.apk t
adb pull /system/app/Settings_ZJMobile.apk t
adb pull /system/app/Settings_ZJMobile_new_signed.apk t
adb pull /system/app/SkyMediaApp_2.0_signed.apk t
adb pull /system/app/SkyMultiScreen_signed.apk t
adb pull /system/app/SkyTerminalManager_CMCC_signed.apk t
adb pull /system/app/MboxSetting_DualOutput.apk t

IflytekTVService.apk 讯飞