什么是jsonp

为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

例子

客户端写法

这里借用了前端jquery框架对jsonp的支持

var ajaxUrl = "http://192.168.8.141:9092/project/rest/team/matchResult/1/20/1/1000";
 
 
function localHandler(data) {
    console.log("fengshu")
    console.log(data);
}
 
var ajaxParam = {
    async: false,
    url: ajaxUrl, 
    type: "GET",
    dataType: 'jsonp',//非正式跨域传输协议
    jsonp: 'localHandler',
    success: function (json) {
        //回调数据在localHandler处理
    }
};
$.ajax(ajaxParam);

服务器端写法

@RequestMapping("/matchResult/{page}/{pageSize}/{type}/{matchId}")
public  void getMatchResult(HttpServletResponse response, @PathVariable("page") int page,
        @PathVariable("pageSize") int pageSize, @PathVariable("type") String type,@PathVariable("matchId") String matchId) {
    EntityList<MatchResult> datas = dddService.getTeamRanks(matchId,type,page,pageSize);
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonResult=null;
    try {
        jsonResult = objectMapper.writeValueAsString(datas);
    } catch (JsonGenerationException e1) {
        e1.printStackTrace();
    } catch (JsonMappingException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    PrintWriter out=null;
    response.setCharacterEncoding("UTF-8");
    try {
        out = response.getWriter();
         
    } catch (IOException e) {
        e.printStackTrace();
    }  out.println( "localHandler("+jsonResult + ")");
            out.close();
}

总结

目前在浏览器端使用json传输数据jsonp传输协议是解决跨域问题的首选方案

山东青岛一户平凡普通的家庭。清晨六点钟,天蒙蒙亮,小孩睁开惺忪的睡眼,见窗外昏暗,又继续倒头睡觉。当他再次醒来时,发现窗外已然大亮,想再赖床但是被妈妈掀开被子后慌忙起身穿衣洗漱,踉跄地来到餐桌前。摆在他面前的是一碗稀松平常的挂面汤,小孩没有什么胃口,可是又无法违抗母亲的命令,而饭桌的另一边,爸爸埋头看报纸,事不关己的样子。于是乎他只得老老实实坐下吃面。与此同时,母亲也扯来一份报纸研读,突然发现一条关于早餐健康饮食的新闻,考虑到孩子的营养极度不均衡,妈妈又迅速增加了早餐的份额,令男孩苦不堪言……

你有多久没有好好坐到餐桌前吃早餐了呢?又有多久没有吃到家人做的早餐了呢?

很多俗语,其实都是人们对经验的概括。它们未必很准确,却总是有些道理。如果我们尝试数学的眼光去分析这些俗语,又会得到什么结果呢?

上得山多终遇虎

靠山吃山靠水吃水,住在山边的人,馋了上山打猎,病了上山采药,总之是经常与大自然亲密接触。但是,在古代,环境还没有被破坏得这么厉害,山上有老虎是常有的事。尽管一只老虎的领地可达数平方公里,它也不是天天在领地闲逛,所以上山打一次猎遇到老虎的概率也不高。但对于那些天天上山打猎的老猎人来说,在职业生涯中一次老虎都没有遇到过,倒是件稀有的事。所谓“上得山多终遇虎”,大概就是指的这种情况。

假设猎人每次上山打猎,遇到老虎的概率是p,也就是说遇不到老虎的概率是1-p。那么,在m次打猎中,每次都没有遇到过老虎的概率就是(1-p)^m。只要有可能遇到老虎,相当于说p>0,当m越来越大时,(1-p)^m就越来越小,趋向于0,也就是说,尽管每次倒霉遇上老虎的概率不高,但如果每天都去打猎的话,总有一天会倒霉的。

可能有人会反过来想:我每次买彩票,中头奖的概率不是0,那么,总有一天我会中头奖的。这种想法既对又不对,理论上来说,的确一直买下去的话总有一天会中奖,但是大概要买多少遍才会中头奖呢?以36选7为例,中头奖的概率是1/C(36,7),所以大概要买C(36,7)期会有一期中头奖,那是大概八百万期,也就是大概两万年。两万年后,福彩是否存在还是个问题。

而对于猎人来说,每次上山遇虎的概率显然没有那么低。要是听到虎啸也算遇虎的话,千分之一应该算是一个不错的估算。这样算来,大概打一千次猎就会有一次遇到老虎,对于经常上山的猎人来说大概十多年就有这个数了,难怪“上得山多终遇虎”。

现在环境破坏得严重,要“遇虎“,大概只能到动物园去了,山里反倒非常安全。“盛世出猛虎”之类的,只能是笑话了。

坐吃山空

“坐吃山空”,大概是告诫那些只愿吃闲饭不愿干活的人,无论家里有多少钱,总有一天要吃光的。

在忽略货币变化的前提下,假设家里的存款是M,一顿饭只需要花费m,这些存款也只能支撑M/m顿饭,也就是说是不可能永远吃闲饭吃下去的。

用数学的语言来说,只要m不是0,无论m多么小,将很多同样的m加起来,我们可以得到要多大有多大的数。这种性质叫做实数的阿基米德性质。

利用阿基米德性质,我们能解释0.999…=1的问题。假设p=1-0.999…,如果p不等于0的话,p就是一个正实数。根据阿基米德性质,总存在一个整数M,使得M*p>=1。于是p=1-p=0.999…。然而,这是不可能的,因为1/M总会在小数点后某一位开始非0,导致1-1/M不等于0.999…。这个矛盾表明我们的假设是错误的,也就是说其实0.999…=1。

很多我们常见的数都有阿基米德性质,比如说有理数,实数,复数。当然,对于复数来说,“要多大有多大”就要重新定义了,一般是用它的范数——也就是在复平面上与原点的距离——来定义的。在复数里边,就应该讲是可以得到范数要多大有多大的数。

也有一些数是没有阿基米德性质的,比如说p进数。它们的结构普遍比实数的要复杂得多,也能表达更多的东西。

久赌必输

从来只听过开赌场而富甲一方的,没听过有赌徒能通过赌博而过上幸福生活的,反倒是家破人亡的不计其数。在赌场赌博的话,既有抽头,赌局也是对赌场有利的。说难听点,去赌场赌钱就相当于直接送钱给赌场老板。就算是一对一机会均等的赌局,要是一直赌下去的话,也总有一天会输光的。这就是“久赌必输”。

假设每盘赌局的赌注是1,而赌徒的财产是n。在每盘赌局中,赌徒有1/2的概率赢,有1/2的概率输。那么,如果一直这样赌下去的话,赌徒输光的概率是多少呢?

显然,赌徒的钱越多,输光需要的局数也越多。当赌徒的财产是n时,我们记输光的概率为p(n)。因为每次赌局有一半的可能赢,一半的可能输,赢的时候财产变成n+1,输的时候变成n-1,所以p(n)=(p(n+1)+p(n-1))/2。当n=0的时候,即使不用赌,所有东西都输光了,所以p(0)=1。

所以,p可以看作一个满足下列递推关系的数列:

p(0)=1

p(n+1)=2p(n)-p(n-1),也就是p(n+1)-p(n)=p(n)-p(n-1)

容易验证p(n)=n*p(1)-(n-1)正好符合上面的递推关系。因为p(n)>=0,所以对于任意的n,必定有p(1)>=1-1/n,所以p(1)=1,从而对于所有的n,p(n)=1。在无限次的赌博中,赌徒在某一次赌博中输光的概率是1。

赌徒的赌博轨迹,可以用所谓的马尔可夫链来描述。赌徒的财产作为状态,而每次赌局相当于在这些状态之间转移,赢钱时转移到钱多些的状态,输钱时转移到钱少些的状态。而破产的状态就像个陷阱,是跳不出的,因为已经没有赌本了。如果一条马尔可夫链有这样的“陷阱”状态,而每一个状态都有可能到达“陷阱”的话,在不断的转移中,总有一天会掉到“陷阱”里去。所谓“久赌必输”,其实说的就是这么一个道理。